Source code for sdss_access.sync.auth
from __future__ import absolute_import, division, print_function, unicode_literals
from six.moves import input
from sdss_access import is_posix
from sdss_access.path import AccessError
from os.path import join
from os import environ
[docs]
class Auth(object):
''' class for setting up SAS authenticaton for SDSS users '''
def __init__(self, netloc=None, public=False, verbose=False):
self.public = public
self.verbose = verbose
self.username = None
self.password = None
self.set_netloc(netloc=netloc)
self.set_netrc()
[docs]
def set_netrc(self):
""" add the following username and password to your ~/.netrc file
and remember to chmod 600 ~/.netrc
For SDSS-IV access:
machine data.sdss.org
login sdss
password ***-******
For SDSS-V access:
machine data.sdss5.org
login sdss5
password *******-*
Windows: recommending _netrc following
https://stackoverflow.com/questions/6031214/git-how-to-use-netrc-file-on-windows-to-save-user-and-password
"""
# set blank netrc
self.netrc = None
# if public do nothing
if self.public:
return
# try to get the netrc file
try:
from netrc import netrc
except Exception as e:
netrc = None
if self.verbose:
print("SDSS_ACCESS> AUTH NETRC: {0}".format(e))
if netrc:
netfile = join(environ['HOME'], "_netrc") if not is_posix else None
try:
self.netrc = netrc(netfile)
except FileNotFoundError as e:
raise AccessError("No netrc file found. Please create one. {0}".format(e))
[docs]
def set_netloc(self, netloc=None):
''' sets the url domain location '''
self.netloc = netloc
[docs]
def set_username(self, username=None, inquire=None):
''' sets the authentication username
Parameters:
username: str
The username for SDSS SAS access
inquire: bool
If True, prompts for input of username.
'''
self.username = input("user [sdss]: ") or "sdss" if inquire else username
[docs]
def set_password(self, password=None, inquire=None):
''' sets the authentication password
Parameters:
password: str
The password for SDSS SAS access
inquire: bool
If True, prompts for input of password.
'''
try:
from getpass import getpass
self.password = getpass("password: ") if inquire else password
except Exception as e:
if self.verbose:
print("SDSS_ACCESS> AUTH PASSWORD: {0}".format(e))
self.password = None
[docs]
def ready(self):
return self.username and self.password
[docs]
def load(self):
''' Sets the username and password from the local netrc file '''
if self.netloc and self.netrc:
authenticators = self.netrc.authenticators(self.netloc)
if authenticators and len(authenticators) == 3:
self.set_username(authenticators[0])
self.set_password(authenticators[2])
if self.verbose:
print("authentication for netloc={0} set for username={1}".format(self.netloc, self.username))
else:
if self.verbose:
print("cannot find {0} in ~/.netrc".format(self.netloc))
self.set_username()
self.set_password()
else:
self.set_username()
self.set_password()
[docs]
class AuthMixin(object):
''' Mixin class to provide authentication method to other classes '''
[docs]
def set_auth(self, username=None, password=None, inquire=True):
''' Set the authentication
Parameters:
username: str
The username for SDSS SAS access
password: str
The password for SDSS SAS access
inquire: bool
If True, prompts for input of username/password.
'''
self.auth = Auth(public=self.public, netloc=self.netloc, verbose=self.verbose)
self.auth.set_username(username)
self.auth.set_password(password)
# if public then exit
if self.public:
return
# try to load the username and password
if not self.auth.ready():
self.auth.load()
# if still not ready then prompt for username and password
if not self.auth.ready():
self.auth.set_username(inquire=inquire)
self.auth.set_password(inquire=inquire)