Skip to content

Commit 230df77

Browse files
author
Shakeel Mohamed
committed
revise storage passwords tests
1 parent 2d1af55 commit 230df77

File tree

3 files changed

+78
-36
lines changed

3 files changed

+78
-36
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,3 +18,4 @@ examples/*/metadata
1818
tests/searchcommands_data/log/
1919
tests/searchcommands_data/output/
2020
examples/searchcommands_app/searchcommand_app.log
21+
Test Results*.html

splunklib/client.py

Lines changed: 23 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1708,16 +1708,18 @@ def __init__(self, service):
17081708
raise ValueError("StoragePasswords cannot have wildcards in namespace.")
17091709
super(StoragePasswords, self).__init__(service, PATH_STORAGE_PASSWORDS, item=StoragePassword)
17101710

1711-
def create(self, realm, username, password):
1711+
def create(self, password, username, realm=None):
17121712
""" Creates a storage password.
17131713
1714-
# TODO: add some notes about processing that happens before hitting the REST API
1714+
The identifier can be passed in through the username parameter as
1715+
<username> or <realm>:<username>, but the preferred way is by
1716+
passing in the username and realm parameters.
17151717
1716-
:param realm: The credential realm.
1718+
:param password: The password for the credentials - this is the only part of the credentials that will be stored securely.
17171719
:type name: ``string``
1718-
:param name: The username for the credentials.
1720+
:param username: The username for the credentials, or <realm>:<username> if the realm parameter is omitted.
17191721
:type name: ``string``
1720-
:param username: The password for the credentials - this is the only part of the credentials that will be stored securely.
1722+
:param realm: The credential realm. (optional)
17211723
:type name: ``string``
17221724
17231725
:return: The :class:`StoragePassword` object created.
@@ -1736,19 +1738,26 @@ def create(self, realm, username, password):
17361738

17371739
return storage_password
17381740

1739-
"""# TODO: docs
1740-
* realm defaults to empty string
1741-
* username is optional... if realm is the full name
1741+
"""Delete a storage password by username and/or realm.
17421742
1743-
"""
1744-
def delete(self, realm, username=None):
1745-
# TODO: encode each component separately
1743+
The identifier can be passed in through the username parameter as
1744+
<username> or <realm>:<username>, but the preferred way is by
1745+
passing in the username and realm parameters.
17461746
1747-
if username is None:
1747+
:param username: The username for the credentials, or <realm>:<username> if the realm parameter is omitted.
1748+
:type name: ``string``
1749+
:param realm: The credential realm. (optional)
1750+
:type name: ``string``
1751+
1752+
"""
1753+
def delete(self, username, realm=None):
1754+
if realm is None:
17481755
# This case makes the username optional, so
1749-
# the full name can be passed in as realm
1750-
name = realm
1756+
# the full name can be passed in as realm.
1757+
# Assume it's already encoded.
1758+
name = username
17511759
else:
1760+
# Encode each component separately
17521761
name = urllib.quote(realm) + ":" + urllib.quote(username)
17531762

17541763
# Append the : expected at the end of the name

tests/test_storage_passwords.py

Lines changed: 54 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919

2020
import splunklib.client as client
2121

22-
class TestCreate(testlib.SDKTestCase):
22+
class Tests(testlib.SDKTestCase):
2323
def setUp(self):
2424
self.service = client.connect(**self.opts.kwargs)
2525
self.storage_passwords = self.service.storage_passwords
@@ -35,7 +35,7 @@ def test_create(self):
3535
realm = testlib.tmpname()
3636
username = testlib.tmpname()
3737

38-
p = self.storage_passwords.create(realm, username, "changeme")
38+
p = self.storage_passwords.create("changeme", username, realm)
3939
self.assertEqual(start_count + 1, len(self.storage_passwords))
4040
self.assertEqual(p.realm, realm)
4141
self.assertEqual(p.username, username)
@@ -49,7 +49,7 @@ def test_create_norealm(self):
4949
start_count = len(self.storage_passwords)
5050
username = testlib.tmpname()
5151

52-
p = self.storage_passwords.create("", username, "changeme")
52+
p = self.storage_passwords.create("changeme", username, "")
5353
self.assertEqual(start_count + 1, len(self.storage_passwords))
5454
self.assertEqual(p.realm, None)
5555
self.assertEqual(p.username, username)
@@ -64,7 +64,7 @@ def test_create_with_colons(self):
6464
username = testlib.tmpname()
6565
realm = testlib.tmpname()
6666

67-
p = self.storage_passwords.create(":start" + realm, username + ":end", "changeme")
67+
p = self.storage_passwords.create("changeme", username + ":end", ":start" + realm)
6868
self.assertEqual(start_count + 1, len(self.storage_passwords))
6969
self.assertEqual(p.realm, ":start" + realm)
7070
self.assertEqual(p.username, username + ":end")
@@ -74,25 +74,56 @@ def test_create_with_colons(self):
7474
p.delete()
7575
self.assertEqual(start_count, len(self.storage_passwords))
7676

77-
realm = ":r:e:a:l:m:"
77+
prefix = testlib.tmpname()
78+
realm = prefix + ":r:e:a:l:m:"
7879
user = ":u:s:e:r:"
79-
p = self.storage_passwords.create(realm, user, "changeme")
80+
p = self.storage_passwords.create("changeme", user, realm)
8081
self.assertEqual(start_count + 1, len(self.storage_passwords))
8182
self.assertEqual(p.realm, realm)
8283
self.assertEqual(p.username, user)
8384
self.assertEqual(p.clear_password, "changeme")
84-
self.assertEqual(p.name, "\\:r\\:e\\:a\\:l\\:m\\::\\:u\\:s\\:e\\:r\\::")
85-
85+
self.assertEqual(p.name, prefix + "\\:r\\:e\\:a\\:l\\:m\\::\\:u\\:s\\:e\\:r\\::")
86+
87+
p.delete()
88+
self.assertEqual(start_count, len(self.storage_passwords))
89+
90+
def test_create_crazy(self):
91+
start_count = len(self.storage_passwords)
92+
username = testlib.tmpname()
93+
realm = testlib.tmpname()
94+
95+
p = self.storage_passwords.create("changeme", username + ":end!@#$%^&*()_+{}:|<>?", ":start::!@#$%^&*()_+{}:|<>?" + realm)
96+
self.assertEqual(start_count + 1, len(self.storage_passwords))
97+
self.assertEqual(p.realm, ":start::!@#$%^&*()_+{}:|<>?" + realm)
98+
self.assertEqual(p.username, username + ":end!@#$%^&*()_+{}:|<>?")
99+
self.assertEqual(p.clear_password, "changeme")
100+
self.assertEqual(p.name, "\\:start\\:\\:!@#$%^&*()_+{}\\:|<>?" + realm + ":" + username + "\\:end!@#$%^&*()_+{}\\:|<>?:")
101+
86102
p.delete()
87103
self.assertEqual(start_count, len(self.storage_passwords))
88104

105+
def test_read(self):
106+
start_count = len(self.storage_passwords)
107+
username = testlib.tmpname()
108+
109+
p = self.storage_passwords.create("changeme", username, "")
110+
self.assertEqual(start_count + 1, len(self.storage_passwords))
111+
112+
for sp in self.storage_passwords:
113+
self.assertTrue(p.name in self.storage_passwords)
114+
# Name works with or without a trailing colon
115+
self.assertTrue((":" + username + ":") in self.storage_passwords)
116+
self.assertTrue((":" + username) in self.storage_passwords)
117+
118+
p.delete()
119+
self.assertEqual(start_count, len(self.storage_passwords))
89120

90121
def test_update(self):
91122
start_count = len(self.storage_passwords)
92123
realm = testlib.tmpname()
93124
username = testlib.tmpname()
94125

95-
p = self.storage_passwords.create(realm, username, "changeme")
126+
p = self.storage_passwords.create("changeme", username, realm)
96127
self.assertEqual(start_count + 1, len(self.storage_passwords))
97128
self.assertEqual(p.realm, realm)
98129
self.assertEqual(p.username, username)
@@ -113,29 +144,30 @@ def test_update(self):
113144
self.assertEqual(start_count, len(self.storage_passwords))
114145

115146
def test_delete(self):
116-
# TODO: make a bunch of tests for different ways of deleting
117147
start_count = len(self.storage_passwords)
148+
username = testlib.tmpname()
118149

119-
p = self.storage_passwords.create("myfoo", "yourbar2", "changeme")
150+
# Testing named parameters
151+
p = self.storage_passwords.create("changeme", username, "myrealm")
120152
self.assertEqual(start_count + 1, len(self.storage_passwords))
121-
self.assertEqual(p.realm, "myfoo")
122-
self.assertEqual(p.username, "yourbar2")
153+
self.assertEqual(p.realm, "myrealm")
154+
self.assertEqual(p.username, username)
123155
self.assertEqual(p.clear_password, "changeme")
124-
self.assertEqual(p.name, "myfoo:yourbar2:")
156+
self.assertEqual(p.name, "myrealm:" + username + ":")
125157

126-
# TODO: move these tests out
127-
for sp in self.storage_passwords:
128-
self.assertTrue("myfoo:yourbar2" in self.storage_passwords)
129-
# Name works with or without a trailing colon
130-
self.assertTrue("myfoo:yourbar2:" in self.storage_passwords)
158+
self.storage_passwords.delete(username, "myrealm")
159+
self.assertEqual(start_count, len(self.storage_passwords))
160+
161+
self.storage_passwords.create("changeme", username, "myrealm")
162+
self.assertEqual(start_count + 1, len(self.storage_passwords))
131163

132-
self.storage_passwords.delete("myfoo:yourbar2")
164+
self.storage_passwords.delete("myrealm:" + username + ":")
133165
self.assertEqual(start_count, len(self.storage_passwords))
134166

135-
self.storage_passwords.create("myfoo", "yourbar2", "changeme")
167+
self.storage_passwords.create("changeme", username, realm="myrealm")
136168
self.assertEqual(start_count + 1, len(self.storage_passwords))
137169

138-
self.storage_passwords.delete("myfoo:yourbar2:")
170+
self.storage_passwords.delete(username, "myrealm")
139171
self.assertEqual(start_count, len(self.storage_passwords))
140172

141173
if __name__ == "__main__":

0 commit comments

Comments
 (0)