; Get an IDLnetUrl object with login credentials. ; The user should only be prompted once per IDL session to login. ; Use common block to manage a singleton instance of a IDLnetURL ; so it will remain alive in the IDL session unless it has expired. function get_mms_sitl_connection, host=host, port=port, authentication=authentication, $ group_leader=group_leader, rebuild=rebuild, username=username, password=password, $ PROXY_AUTHENTICATION=proxy_authentication, PROXY_HOSTNAME=proxy_hostname, $ PROXY_PASSWORD=proxy_password, PROXY_PORT=proxy_port, PROXY_USERNAME=proxy_username, $ scheme=scheme common mms_sitl_connection, netUrl, connection_time, login_source ; Define the length of time the login will remain valid, in seconds. expire_duration = 86400 ;24 hours ; Test if login has expired. If so, destroy the IDLnetURL object and replace it with -1 ; so the login will be triggered below. if (n_elements(connection_time) eq 1) then begin duration = systime(/seconds) - connection_time if (duration gt expire_duration) then mms_sitl_logout endif if n_elements(host) eq 0 then host = "lasp.colorado.edu" if host eq "lasp.colorado.edu" then begin ; only https supported scheme = "https" port = 443 endif else begin ; assume internal server if n_elements(scheme) eq 0 then scheme = "http" if n_elements(port) eq 0 then port = 80 endelse if n_elements(authentication) eq 0 then authentication = 1 ;basic ;Make sure the singleton instance has been created ;TODO: consider error cases, avoid leaving incomplete netURL in common block type = size(netUrl, /type) ;will be 11 if object has been created doRebuild = 0 if (type eq 11) then begin if keyword_set(rebuild) then doRebuild = 1 endif else begin doRebuild = 1 endelse if (doRebuild eq 1) then begin ; Construct the IDLnetURL object and set the login properties. netUrl = OBJ_NEW('IDLnetUrl') netUrl->SetProperty, URL_SCHEME = scheme netUrl->SetProperty, URL_HOST = host netUrl->SetProperty, URL_PORT = port netUrl->SetProperty, SSL_VERIFY_HOST = 0 ;don't worry about certificate netUrl->SetProperty, SSL_VERIFY_PEER = 0 ;If authentication is requested, get login from user and add to netURL properties if authentication gt 0 then begin ;If we have a failed or expired login, make sure we use the gui if we did last time if (n_elements(login_source) eq 1) then group_leader = login_source ;If the caller requested the gui login option, save that in the common block ;so we can use the same login mechanism if the login fails or expires. if n_elements(group_leader) eq 1 then login_source = group_leader if n_elements(username) eq 0 or n_elements(password) eq 0 then begin ;Get the login credentials login = mms_sitl_login(group_leader=group_leader) username = login.username password = login.password endif ;1: basic only, 2: digest, 3: try both netUrl->SetProperty, AUTHENTICATION = authentication netUrl->SetProperty, URL_USERNAME = username netUrl->SetProperty, URL_PASSWORD = password ; if proxy_hostname is given, set up for proxy authentication if n_elements(proxy_hostname) gt 0 && strlen(proxy_hostname) gt 0 then begin if n_elements(proxy_authentication) eq 0 then begin ; default to trying both basic and digest proxy_authentication = 3 endif netUrl->SetProperty, PROXY_AUTHENTICATION = proxy_authentication netUrl->SetProperty, PROXY_HOSTNAME = proxy_hostname netUrl->SetProperty, PROXY_PASSWORD = proxy_password netUrl->SetProperty, PROXY_PORT = proxy_port netUrl->SetProperty, PROXY_USERNAME = proxy_username endif ; check that the connection is valid ; only when authentication enabled to avoid ; breaking tests, which assume a single connection on a specified port status = validate_mms_sitl_connection(netUrl) if status ne 0 then begin ; clear the connection junk = size(temporary(netUrl)) return, status endif endif ; Set the time of the login so we can make it expire. connection_time = systime(/seconds) endif ;TODO: if parameters are set and netURL already exists, reset properties return, netUrl end