Skip to content

Commit b3771b4

Browse files
Merge pull request #2220 from softlayer/issues2219
Improved employee auth to work better on dev servers
2 parents 727c59e + ae07408 commit b3771b4

File tree

5 files changed

+38
-21
lines changed

5 files changed

+38
-21
lines changed

SoftLayer/API.py

+4-5
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@
4646
'raw_headers',
4747
'limit',
4848
'offset',
49-
'verify',
49+
'verify'
5050
))
5151

5252

@@ -182,7 +182,7 @@ def employee_client(username=None,
182182
verify=None,
183183
config_file=config_file)
184184

185-
url = settings.get('endpoint_url')
185+
url = settings.get('endpoint_url', '')
186186
verify = settings.get('verify', True)
187187

188188
if 'internal' not in url:
@@ -374,7 +374,6 @@ def call(self, service, method, *args, **kwargs):
374374
request.url = self.settings['softlayer'].get('endpoint_url')
375375
if kwargs.get('verify') is not None:
376376
request.verify = kwargs.get('verify')
377-
378377
if self.auth:
379378
request = self.auth.get_request(request)
380379

@@ -495,7 +494,7 @@ def __setAuth(self, auth=None):
495494
"""Prepares the authentication property"""
496495
if auth is None:
497496
auth_cert = self.settings['softlayer'].get('auth_cert')
498-
serv_cert = self.settings['softlayer'].get('server_cert', None)
497+
serv_cert = self.settings['softlayer'].get('verify', True)
499498
auth = slauth.X509Authentication(auth_cert, serv_cert)
500499
self.auth = auth
501500

@@ -712,7 +711,7 @@ def authenticate_with_internal(self, username, password, security_token=None):
712711
if len(security_token) != 6:
713712
raise exceptions.SoftLayerAPIError("Invalid security token: {}".format(security_token))
714713

715-
auth_result = self.call('SoftLayer_User_Employee', 'performExternalAuthentication',
714+
auth_result = self.call('SoftLayer_User_Employee', 'getEncryptedSessionToken',
716715
username, password, security_token)
717716

718717
self.settings['softlayer']['access_token'] = auth_result['hash']

SoftLayer/CLI/login.py

+7-10
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44

55
import click
66

7-
from SoftLayer.API import employee_client
87
from SoftLayer.CLI.command import SLCommand as SLCommand
98
from SoftLayer.CLI import environment
109
from SoftLayer import config
@@ -30,16 +29,15 @@ def cli(env):
3029
username = settings.get('username') or os.environ.get('SLCLI_USER', None)
3130
password = os.environ.get('SLCLI_PASSWORD', '')
3231
yubi = None
33-
client = employee_client(config_file=env.config_file)
3432

3533
# Might already be logged in, try and refresh token
3634
if settings.get('access_token') and settings.get('userid'):
37-
client.authenticate_with_hash(settings.get('userid'), settings.get('access_token'))
35+
env.client.authenticate_with_hash(settings.get('userid'), settings.get('access_token'))
3836
try:
3937
emp_id = settings.get('userid')
40-
client.call('SoftLayer_User_Employee', 'getObject', id=emp_id, mask="mask[id,username]")
41-
client.refresh_token(emp_id, settings.get('access_token'))
42-
client.call('SoftLayer_User_Employee', 'refreshEncryptedToken', settings.get('access_token'), id=emp_id)
38+
env.client.call('SoftLayer_User_Employee', 'getObject', id=emp_id, mask="mask[id,username]")
39+
env.client.refresh_token(emp_id, settings.get('access_token'))
40+
env.client.call('SoftLayer_User_Employee', 'refreshEncryptedToken', settings.get('access_token'), id=emp_id)
4341

4442
config_settings['softlayer'] = settings
4543
config.write_config(config_settings, env.config_file)
@@ -52,13 +50,12 @@ def cli(env):
5250
click.echo("URL: {}".format(url))
5351
if username is None:
5452
username = input("Username: ")
55-
click.echo("Username: {}".format(username))
5653
if not password:
57-
password = env.getpass("Password: ")
58-
click.echo("Password: {}".format(censor_password(password)))
54+
password = env.getpass("Password: ", default="")
5955
yubi = input("Yubi: ")
56+
6057
try:
61-
result = client.authenticate_with_internal(username, password, str(yubi))
58+
result = env.client.authenticate_with_internal(username, password, str(yubi))
6259
print(result)
6360
# pylint: disable=broad-exception-caught
6461
except Exception as e:

SoftLayer/auth.py

+4-4
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
66
:license: MIT, see LICENSE for more details.
77
"""
8-
8+
import os
99

1010
__all__ = [
1111
'BasicAuthentication',
@@ -89,7 +89,7 @@ def get_request(self, request):
8989
return request
9090

9191
def __repr__(self):
92-
return "BasicAuthentication(username=%r)" % self.username
92+
return f"BasicAuthentication(username={self.username})"
9393

9494

9595
class BasicHTTPAuthentication(AuthenticationBase):
@@ -110,7 +110,7 @@ def get_request(self, request):
110110
return request
111111

112112
def __repr__(self):
113-
return "BasicHTTPAuthentication(username=%r)" % self.username
113+
return f"BasicHTTPAuthentication(username={self.username}"
114114

115115

116116
class BearerAuthentication(AuthenticationBase):
@@ -149,7 +149,7 @@ class X509Authentication(AuthenticationBase):
149149
"""
150150

151151
def __init__(self, cert, ca_cert):
152-
self.cert = cert
152+
self.cert = os.path.expanduser(cert)
153153
self.ca_cert = ca_cert
154154

155155
def get_request(self, request):

SoftLayer/transports/rest.py

+5-1
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,9 @@ def __call__(self, request):
7676

7777
request.params = params
7878

79+
# This handles any edge cases on the REST api.
80+
request.special_rest_params()
81+
7982
auth = None
8083
if request.transport_user:
8184
auth = requests.auth.HTTPBasicAuth(
@@ -110,7 +113,6 @@ def __call__(self, request):
110113
# Prefer the request setting, if it's not None
111114
if request.verify is None:
112115
request.verify = self.verify
113-
114116
try:
115117
resp = self.client.request(method, request.url,
116118
auth=auth,
@@ -163,6 +165,8 @@ def print_reproduceable(request):
163165
164166
:param request request: Request object
165167
"""
168+
# This handles any edge cases on the REST api.
169+
request.special_rest_params()
166170
command = "curl -u $SL_USER:$SL_APIKEY -X {method} -H {headers} {data} '{uri}'"
167171

168172
method = REST_SPECIAL_METHODS.get(request.method)

SoftLayer/transports/transport.py

+18-1
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,9 @@ def __init__(self):
4444
#: API Parameters.
4545
self.args = tuple()
4646

47+
#: URL Parameters, used for the REST Transport
48+
self.params = None
49+
4750
#: API headers, used for authentication, masks, limits, offsets, etc.
4851
self.headers = {}
4952

@@ -103,13 +106,27 @@ def __repr__(self):
103106
pretty_filter = self.filter
104107
clean_args = self.args
105108
# Passwords can show up here, so censor them before logging.
106-
if self.method in ["performExternalAuthentication", "refreshEncryptedToken", "getPortalLoginToken"]:
109+
if self.method in ["performExternalAuthentication", "refreshEncryptedToken",
110+
"getPortalLoginToken", "getEncryptedSessionToken"]:
107111
clean_args = "*************"
108112
param_string = (f"id={self.identifier}, mask='{pretty_mask}', filter='{pretty_filter}', args={clean_args}, "
109113
f"limit={self.limit}, offset={self.offset}")
110114
return "{service}::{method}({params})".format(
111115
service=self.service, method=self.method, params=param_string)
112116

117+
def special_rest_params(self):
118+
"""This method is to handle the edge case of SoftLayer_User_Employee::getEncryptedSessionToken
119+
120+
Added this method here since it was a little easier to change the data as needed this way.
121+
"""
122+
if self.method == "getEncryptedSessionToken" and self.service == "SoftLayer_User_Employee":
123+
if len(self.args) < 3:
124+
return
125+
self.params = {"remoteToken": self.args[2]}
126+
self.transport_user = self.args[0]
127+
self.transport_password = self.args[1]
128+
self.args = []
129+
113130

114131
class SoftLayerListResult(list):
115132
"""A SoftLayer API list result."""

0 commit comments

Comments
 (0)