Source code for hiresprv.auth
"""
The ``hiresprv.login`` module initializes an account on the PRV pipeline
server for reduction of radial velocity data.
"""
import getpass
import logging
import json
import urllib
import http.cookiejar
[docs]def login(cookiepath):
"""
The login function prompts for an authorized KOA user ID and password,
then sets up a workspace (or connects to an existing workspace) on
the PRV pipeline server for that user.
Args:
cookiepath (string): a file path provided by the user to save
returned cookie which is needed for the
subsequent PRV operations.
Example:
>>> import hiresprv.auth
>>> hiresprv.auth.login(cookiepath)
# program will prompt for userid and password
"""
# TODO: Many of these variables are not used
userid = ''
password = ''
url = ''
response = ''
jsondata = ''
status = ''
msg = ''
debug = 0
debugfile = ''
if len(debugfile) > 0:
debug = 1
logging.basicConfig(filename=debugfile, level=logging.DEBUG)
# TODO: Do we need this?
with open(debugfile, 'w') as fdebug:
pass
if debug:
logging.debug('')
logging.debug('Enter Login.init:')
logging.debug('cookiepath= %s' % cookiepath)
#
# get userid and password via keyboard input
#
userid = input("KOA userid: ")
if debug:
logging.debug('')
logging.debug('userid= %s' % userid)
password = getpass.getpass("KOA Password: ")
if debug:
logging.debug('')
logging.debug('password= %s' % password)
password = urllib.parse.quote(password)
if debug:
logging.debug('')
logging.debug('after urlencode: password= %s' % password)
cookiejar = http.cookiejar.MozillaCookieJar(cookiepath)
#
# url for login
#
url = 'http://hiresprv.ipac.caltech.edu/cgi-bin/PrvPython/nph-prvLogin.py?'
url = url + 'userid=' + userid + '&'
url = url + 'password=' + password
if debug:
logging.debug('')
logging.debug('url= %s' % url)
#
# build url_opener
#
# TODO: unused variable
data = None
try:
opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cookiejar))
if debug:
logging.debug('here1')
urllib.request.install_opener(opener)
if debug:
logging.debug('opener installed')
request = urllib.request.Request(url)
if debug:
logging.debug('here2')
cookiejar.add_cookie_header(request)
if debug:
logging.debug('cookie added')
response = opener.open(request)
if debug:
logging.debug('response= ')
logging.debug(response)
except urllib.error.URLError as e:
status = 'error'
msg = 'URLError= ' + e.reason
if debug:
logging.debug('e.code= ' + e.code + ' e.reason= ' + e.reason)
logging.debug('URLError: msg= %s' % msg)
except urllib.error.HTTPError as e:
status = 'error'
msg = 'HTTPError= ' + e.reason
if debug:
logging.debug('HTTPError: msg= %s' % msg)
# TODO: Is there a more specific exception we should catch here?
# I see that this is the last of several possible exceptions so
# probaby OK to let slide here.
except Exception:
status = 'error'
msg = 'URL exception'
if debug:
logging.debug('other exceptions')
if status == 'error':
msg = 'Failed to login: %s' % msg
print(msg)
return
if debug:
logging.debug('got here: response= ')
logging.debug(response)
#
# check content-type in response header:
# if it is 'application/json', then it is an error message
#
if debug:
logging.debug('response.info=')
logging.debug(response.info())
infostr = dict(response.info())
if debug:
logging.debug('infostr= %s' % infostr)
contenttype = infostr.get('Content-type')
if debug:
logging.debug('contenttype= %s ' % contenttype)
data = response.read()
sdata = data.decode("utf-8")
jsondata = json.loads(sdata)
if debug:
logging.debug('here2: data= ')
logging.debug(data)
logging.debug('sdata= %s' % sdata)
logging.debug('jsondata= ')
logging.debug(jsondata)
for key, val in jsondata.items():
if debug:
logging.debug('key= %s val= %s' % (key, val))
if key == 'status':
status = val
if key == 'msg':
msg = val
if debug:
logging.debug('status= %s msg= %s' % (status, msg))
if status == 'ok':
cookiejar.save(cookiepath, ignore_discard=True)
if debug:
logging.debug('cookiejar saved to hirescookietxt')
msg = 'Successful login as %s' % userid
else:
msg = 'Failed to login: %s' % msg
if debug:
logging.debug('')
logging.debug('status= %s' % status)
logging.debug('msg= %s' % msg)
print(msg)
return