Skip to content
This repository was archived by the owner on Aug 30, 2024. It is now read-only.

Commit 2602991

Browse files
committed
Removed user and password creds from URL property
1 parent 1020447 commit 2602991

File tree

3 files changed

+45
-6
lines changed

3 files changed

+45
-6
lines changed

CHANGES.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
- [NEW] Support IAM authentication in replication documents.
66
- [IMPROVED] Added support for IAM API key in `cloudant_bluemix` method.
77
- [IMPROVED] Updated Travis CI and unit tests to run against CouchDB 2.1.1.
8+
- [IMPROVED] Shortened length of client URLs by removing username and password.
89

910
# 2.8.1 (2018-02-16)
1011

src/cloudant/client.py

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
instance.
1818
"""
1919
import json
20+
from ._2to3 import url_parse
2021

2122
from ._client_session import (
2223
BasicSession,
@@ -93,6 +94,20 @@ def __init__(self, user, auth_token, admin_party=False, **kwargs):
9394
self._auto_renew = kwargs.get('auto_renew', False)
9495
self._use_basic_auth = kwargs.get('use_basic_auth', False)
9596
self._use_iam = kwargs.get('use_iam', False)
97+
# If user/pass exist in URL, remove and set variables
98+
if not self._use_basic_auth and self.server_url:
99+
parsed_url = url_parse(kwargs.get('url'))
100+
# Note: To prevent conflicts with field names, the method
101+
# and attribute names of `url_parse` start with an underscore
102+
if parsed_url.port is None:
103+
self.server_url = parsed_url._replace(
104+
netloc="{}".format(parsed_url.hostname)).geturl()
105+
else:
106+
self.server_url = parsed_url._replace(
107+
netloc="{}:{}".format(parsed_url.hostname, parsed_url.port)).geturl()
108+
if (not user and not auth_token) and (parsed_url.username and parsed_url.password):
109+
self._user = parsed_url.username
110+
self._auth_token = parsed_url.password
96111

97112
connect_to_couch = kwargs.get('connect', False)
98113
if connect_to_couch and self._DATABASE_CLASS == CouchDatabase:
@@ -450,14 +465,10 @@ def __init__(self, cloudant_user, auth_token, **kwargs):
450465
super(Cloudant, self).__init__(cloudant_user, auth_token, **kwargs)
451466
self._client_user_header = {'User-Agent': USER_AGENT}
452467
account = kwargs.get('account')
453-
url = kwargs.get('url')
454-
x_cloudant_user = kwargs.get('x_cloudant_user')
455468
if account is not None:
456469
self.server_url = 'https://{0}.cloudant.com'.format(account)
457-
elif kwargs.get('url') is not None:
458-
self.server_url = url
459-
if x_cloudant_user is not None:
460-
self._client_user_header['X-Cloudant-User'] = x_cloudant_user
470+
if kwargs.get('x_cloudant_user') is not None:
471+
self._client_user_header['X-Cloudant-User'] = kwargs.get('x_cloudant_user')
461472

462473
if self.server_url is None:
463474
raise CloudantClientException(102)

tests/unit/client_tests.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,20 @@ def test_constructor_with_url(self):
128128
self.assertEqual(self.client.encoder, json.JSONEncoder)
129129
self.assertIsNone(self.client.r_session)
130130

131+
def test_constructor_with_creds_removed_from_url(self):
132+
"""
133+
Test instantiating a client object using a URL
134+
"""
135+
client = CouchDB(None, None, url='http://a9a9a9a9-a9a9-a9a9-a9a9-a9a9a9a9a9a9-bluemix'
136+
':a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9'
137+
'a9a9a9a9a9a9@d8a01891-e4d2-4102-b5f8-751fb735ce31-'
138+
'bluemix.couchdb.local:5984')
139+
self.assertEqual(client.server_url, 'http://d8a01891-e4d2-4102-b5f8-751fb735ce31-'
140+
'bluemix.couchdb.local:5984')
141+
self.assertEqual(client._user, 'a9a9a9a9-a9a9-a9a9-a9a9-a9a9a9a9a9a9-bluemix')
142+
self.assertEqual(client._auth_token, 'a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a'
143+
'9a9a9a9a9a9a9a9a9a9a9a9a9')
144+
131145
def test_connect(self):
132146
"""
133147
Test connect and disconnect functionality.
@@ -594,6 +608,19 @@ class CloudantClientTests(UnitTestDbBase):
594608
Cloudant specific client unit tests
595609
"""
596610

611+
def test_constructor_with_creds_removed_from_url(self):
612+
"""
613+
Test instantiating a client object using a URL
614+
"""
615+
client = Cloudant(None, None, url='https://a9a9a9a9-a9a9-a9a9-a9a9-a9a9a9a9a9a9-bluemix'
616+
':a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9'
617+
'a9a9a9a9a9a9@d8a01891-e4d2-4102-b5f8-751fb735ce31-'
618+
'bluemix.cloudant.com')
619+
self.assertEqual(client.server_url, 'https://d8a01891-e4d2-4102-b5f8-751fb735ce31-'
620+
'bluemix.cloudant.com')
621+
self.assertEqual(client._user, 'a9a9a9a9-a9a9-a9a9-a9a9-a9a9a9a9a9a9-bluemix')
622+
self.assertEqual(client._auth_token, 'a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a'
623+
'9a9a9a9a9a9a9a9a9a9a9a9a9')
597624
@skip_if_not_cookie_auth
598625
def test_cloudant_session_login(self):
599626
"""

0 commit comments

Comments
 (0)