From 62eedcb5256f4e3b4a9c2f83da4598522e933719 Mon Sep 17 00:00:00 2001 From: Andrew Scott Date: Fri, 13 Dec 2019 11:52:16 -0500 Subject: [PATCH 1/6] Add user api example/test --- examples/users.py | 61 +++ tenable_io/api/models.py | 3 + .../cassettes/TestExamples.test_users.yaml | 370 ++++++++++++++++++ tests/integration/examples/test_examples.py | 5 + 4 files changed, 439 insertions(+) create mode 100644 examples/users.py create mode 100644 tests/integration/examples/cassettes/TestExamples.test_users.yaml diff --git a/examples/users.py b/examples/users.py new file mode 100644 index 0000000..60fa2f4 --- /dev/null +++ b/examples/users.py @@ -0,0 +1,61 @@ +import random + +from tenable_io.client import TenableIOClient +from tenable_io.exceptions import TenableIOApiException +from tenable_io.api.models import User, Permissions +from tenable_io.api.users import UserCreateRequest, UserEditRequest + + +def example(test_domain): + + test_user_name = u'example_test_user_{}'.format(random.randint(1, 100)) + test_user_username = u'{}@{}'.format(test_user_name, test_domain) + + ''' + Instantiate an instance of the TenableIOClient. + ''' + client = TenableIOClient() + + ''' + Create a new Standard User + ''' + user_create_request = UserCreateRequest(username=test_user_username, + password='Sdk!Test1234{}'.format(random.randint(1, 100)), + permissions=Permissions.User.PERMISSION_STANDARD, + name=test_user_name, + email=test_user_username, + type=User.LOCAL) + std_user_id = client.users_api.create(user_create_request) + assert std_user_id + + ''' + Fetch user details + ''' + std_user = client.users_api.details(std_user_id) + assert isinstance(std_user, User) + assert std_user.username == test_user_username + + ''' + Check that new user is included in user list + ''' + user_list = client.users_api.list() + assert any([u.id for u in user_list.users if u.id == std_user_id]) + + ''' + Edit user + ''' + user_edit_request = UserEditRequest(name=test_user_name+'_edit') + edited_std_user = client.users_api.edit(std_user_id, user_edit_request) + assert isinstance(edited_std_user, User) + assert edited_std_user.name == test_user_name + '_edit' + + ''' + Delete user + ''' + assert client.users_api.delete(std_user_id) + + ''' + Check that deleted user is not included in user list + ''' + user_list = client.users_api.list() + assert not any([u.id for u in user_list.users if u.id == std_user_id]) diff --git a/tenable_io/api/models.py b/tenable_io/api/models.py index 13e5265..5c0490b 100644 --- a/tenable_io/api/models.py +++ b/tenable_io/api/models.py @@ -2187,6 +2187,9 @@ def templates(self, templates): class User(BaseModel): + LOCAL = u'local' + LDAP = u'LDAP' + def __init__( self, id=None, diff --git a/tests/integration/examples/cassettes/TestExamples.test_users.yaml b/tests/integration/examples/cassettes/TestExamples.test_users.yaml new file mode 100644 index 0000000..786a16e --- /dev/null +++ b/tests/integration/examples/cassettes/TestExamples.test_users.yaml @@ -0,0 +1,370 @@ +interactions: +- request: + body: '{"username": "example_test_user_30@sdk.org", "password": "Sdk!Test123444", + "permissions": 32, "name": "example_test_user_30", "email": "example_test_user_30@sdk.org", + "type": "local"}' + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '183' + Content-Type: + - application/json + User-Agent: + - TenableIOSDK Python/3.7.3/1.10.1 + X-APIKeys: + - accessKey=TIO_ACCESS_KEY;secretKey=TIO_SECRET_KEY + method: POST + uri: https://cloud.tenable.com/users + response: + body: + string: !!binary | + H4sIAAAAAAAAA41QSW7FIAy9C+tQJQE+SVb/JsiAQagJRAxSq6p3L+mw6Kb9S7/Jz34jrQVLNgJi + khJmRxenHeWTlnQRsFK8oRwnoZnVSAZyaTkfSCuYVYQDuxVf4Dh3VBVLVZ8EG+/FPj+l7MmX9DEl + HhD2/2V/hHW2vp4XuycDex9NihVC7Oz3oVxMWhu50FXPhnLjGNUjCMpuFu3KpF6E7T7wPqOH2rNq + bjiQE/MRSgkpFrKxeegbfIjK9crKpBYr2cZfYE21N7hAjKB3tD9JVxH1+NPfPwC5nxk0pAEAAA== + headers: + Cache-Control: + - no-cache + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Type: + - application/json; charset=utf-8 + Date: + - Fri, 13 Dec 2019 16:51:13 GMT + Server: + - tenable.io + Set-Cookie: + - nginx-cloud-site-id=us-2b; path=/; HttpOnly; Secure + - nginx-cloud-site-id=us-2b; path=/; HttpOnly; Secure + Strict-Transport-Security: + - max-age=63072000; includeSubDomains + Transfer-Encoding: + - chunked + Vary: + - accept-encoding + X-Content-Type-Options: + - nosniff + X-Gateway-Site-ID: + - nginx-router-7ms2v-us-east-2-prod + X-Request-Uuid: + - 6994df15b4d565f1277fe156aedc96aa + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Cookie: + - nginx-cloud-site-id=us-2b + User-Agent: + - TenableIOSDK Python/3.7.3/1.10.1 + X-APIKeys: + - accessKey=TIO_ACCESS_KEY;secretKey=TIO_SECRET_KEY + method: GET + uri: https://cloud.tenable.com/users/44 + response: + body: + string: !!binary | + H4sIAAAAAAAAA41QzW7DIAx+F85hSgKUJKe+CbLBVGgJRAGkTVXffaTbZZetR39/tr87qzU4tjBQ + g9Ywej559FwOqPmkYOZ0Id0PCoVDYh07tVJ2rGY6TISNmpU+YNtXMoVyMU9C9Nfs3t/ScWPf0teU + tEFY/5f9EdbY8rmf7JosrG20KRYIsbE/j0o1IFo98RlHy6X1gmMPiouLIzcLjZNyzbfTsYWcQ4qZ + LWLsWuAtROPbhcamGgtb+l9gSaUtPEGKgCu1XeWo1D0LNq93/PgC1BHLcJMBAAA= + headers: + Cache-Control: + - no-cache + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Type: + - application/json; charset=utf-8 + Date: + - Fri, 13 Dec 2019 16:51:13 GMT + Server: + - tenable.io + Set-Cookie: + - nginx-cloud-site-id=us-2b; path=/; HttpOnly; Secure + - nginx-cloud-site-id=us-2b; path=/; HttpOnly; Secure + Strict-Transport-Security: + - max-age=63072000; includeSubDomains + Transfer-Encoding: + - chunked + Vary: + - accept-encoding + X-Content-Type-Options: + - nosniff + X-Gateway-Site-ID: + - nginx-router-7ms2v-us-east-2-prod + X-Request-Uuid: + - c5ded4aec1bed90a9666f5477ba009fd + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Cookie: + - nginx-cloud-site-id=us-2b + User-Agent: + - TenableIOSDK Python/3.7.3/1.10.1 + X-APIKeys: + - accessKey=TIO_ACCESS_KEY;secretKey=TIO_SECRET_KEY + method: GET + uri: https://cloud.tenable.com/users + response: + body: + string: !!binary | + H4sIAAAAAAAAA9WY3W7jNhCF30XXYcH/IXPV9ygKYUgOA6O2HFgy2mKRd+8osbZKYlnqIos0NwZE + HUrU+XDIGX9rzj2d+ub+t2/N+bwrzX1D4HLJgUTSAYVFAyLErIXPzlMwLjqJzV0zavXd8/S2wwPx + TOzKif78tS9//HI8PTQvN5fu0QF3+2s3liYMfz+O4/tjxj1f5mM34K7jt1/WbZ1KKUMQMeksbK5G + JIlOGF+oRAMpuMLzHul02PX97tjxV3t7xw982HVt5dW0+XjuhuZevhocjgO/cBykDtOe+F3D6Uys + wX541jX3yoG1TmoTAPiR44ra7WY+3X0332gNPqgsNFkQFlwQKUIWQVpTElWXaTLfvjZ/oH5onwf6 + gb3DU2nBaH+dxrp4wnNFGZ1X73l9F/Y/iZXRP8Sq4r6nOZJNFs+QYPSACr3wNpdJX5NAqkaHYH2V + 6YLErSJhk8NmJG/EN5AYUPCFkWyyeIakYkFOXOJUKUaIpYqgghISVY6Goi3SXJD4JSRYDrxETm1c + 43FV+R7Gi8xpJT+BxA9uZO9IbHJ2RsJZULFKI7wvlslpEqEoNYKsOhHGZOWFBCyGI2PXHvlzcDie + WgvGrCbk1owrMXkl997aTyCkP4jQJsdnhIKSCkNFEUOqTDSiwFz4BOL9DmoFXmq8EAo3CR2wwwe+ + MAByE6CFCQt8JrUDE2/gaansBio/CZKVHwNpk+nzGHmXVDIkSCsSNvosUrBaSOURwMtUYdrQ4hKk + hP0uj/atwbkmfA/lRRU8uE8Ii/IfFJYtvs45GK7gIq9Q2/xcG0gRNP+gMlRyAZdAT+WXXD3sg4mr + h8uS+MZhr4z0X/iw3+TxjAkZa4BSErGEMGaJiwPlvSguO2NLDBXqxEStMlHyPxRgb8Q3mIAKn5GT + j2KyyeN5m6JsBAYpSkXWR1dFylywlRKM0dJzGREmJnqVCad0O5M34htMnIevXBRv8njGhFsXIo9K + JMsLtgoc73XMkGoqpVgZIpaJiVnPiVHbY/JKe4NIUE5/YSKbHJ53jk4BoOYSuo5VgErc/DuMgjyB + VC6N7eZE5E03T3/h4XFP7b8mmoWia0U50ViR3XjY/wvKy18vs9Zxi8dPvz/9A72/fDnpEgAA + headers: + Cache-Control: + - no-cache + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Type: + - application/json; charset=utf-8 + Date: + - Fri, 13 Dec 2019 16:51:13 GMT + Server: + - tenable.io + Set-Cookie: + - nginx-cloud-site-id=us-2b; path=/; HttpOnly; Secure + - nginx-cloud-site-id=us-2b; path=/; HttpOnly; Secure + Strict-Transport-Security: + - max-age=63072000; includeSubDomains + Transfer-Encoding: + - chunked + Vary: + - accept-encoding + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - DENY + X-Gateway-Site-ID: + - nginx-router-7ms2v-us-east-2-prod + X-Request-Uuid: + - 5d36665f8686f5bfd247f198c4e91b30 + X-Xss-Protection: + - 1; mode=block + status: + code: 200 + message: OK +- request: + body: '{"name": "example_test_user_30_edit"}' + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '37' + Content-Type: + - application/json + Cookie: + - nginx-cloud-site-id=us-2b + User-Agent: + - TenableIOSDK Python/3.7.3/1.10.1 + X-APIKeys: + - accessKey=TIO_ACCESS_KEY;secretKey=TIO_SECRET_KEY + method: PUT + uri: https://cloud.tenable.com/users/44 + response: + body: + string: !!binary | + H4sIAAAAAAAAA42Ry26EMAxF/yVrUgEhE2A1fxI5iaFRIUF5dFpV/feaPhbdtLP09bn2tfzGavWO + zQxkpxT0Cx8Xs/ChM4qPEiaOF1RtJ41wBlnDTnYYGlYzJh1gR7LiC+zHhrpgLvqzIdprdk8PMa3s + C72PxB389j/2xzCNzhdCyutxIlu0sFFpYyjgAyHf1w6yM8aqkU+mt3ywi+CmBcnFxaGbhDKjdOS7 + PULJAW/6GVP2MZCTVFjXhCsU2lBSxYYdmHafTyCzWfQN7V190Atdo22sobC5/SWWWCjXKWIAs6H7 + mXTG0/f/4/0DcoRCZb8BAAA= + headers: + Cache-Control: + - no-cache + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Type: + - application/json; charset=utf-8 + Date: + - Fri, 13 Dec 2019 16:51:14 GMT + Server: + - tenable.io + Set-Cookie: + - nginx-cloud-site-id=us-2b; path=/; HttpOnly; Secure + - nginx-cloud-site-id=us-2b; path=/; HttpOnly; Secure + Strict-Transport-Security: + - max-age=63072000; includeSubDomains + Transfer-Encoding: + - chunked + Vary: + - accept-encoding + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - DENY + X-Gateway-Site-ID: + - nginx-router-7ms2v-us-east-2-prod + X-Request-Uuid: + - ec411298d20d8990393c2ae7d47db58b + X-Xss-Protection: + - 1; mode=block + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + Cookie: + - nginx-cloud-site-id=us-2b + User-Agent: + - TenableIOSDK Python/3.7.3/1.10.1 + X-APIKeys: + - accessKey=TIO_ACCESS_KEY;secretKey=TIO_SECRET_KEY + method: DELETE + uri: https://cloud.tenable.com/users/44 + response: + body: + string: '' + headers: + Cache-Control: + - no-cache + Connection: + - keep-alive + Date: + - Fri, 13 Dec 2019 16:51:15 GMT + Server: + - tenable.io + Set-Cookie: + - nginx-cloud-site-id=us-2b; path=/; HttpOnly; Secure + - nginx-cloud-site-id=us-2b; path=/; HttpOnly; Secure + Strict-Transport-Security: + - max-age=63072000; includeSubDomains + Transfer-Encoding: + - chunked + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - DENY + X-Gateway-Site-ID: + - nginx-router-7ms2v-us-east-2-prod + X-Request-Uuid: + - 384db9dfd75e76169142dd956884da4e + X-Xss-Protection: + - 1; mode=block + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Cookie: + - nginx-cloud-site-id=us-2b + User-Agent: + - TenableIOSDK Python/3.7.3/1.10.1 + X-APIKeys: + - accessKey=TIO_ACCESS_KEY;secretKey=TIO_SECRET_KEY + method: GET + uri: https://cloud.tenable.com/users + response: + body: + string: !!binary | + H4sIAAAAAAAAA9WX24rbMBCG38XXUdF5pL3qe5RiRqclNLGX2KGUZd+9k2y8OJuD3SUl5MZg6Zc9 + /j9+afxabbu86aqnH6/VdrtM1VOVwcQUXWZBOmQaFTDno2Q2GpudMt5wrBbVTisX++V1g+tMK7FJ + m/z7e5d+fWs3z9X75KW5vMbl6tzEpQX9n5fd+KqNuKLb2DY9Lht6+6FubUQIERzzQUamY1EscDRM + 2ZSTVxCcSbTuJW/Wy65btg19tdULeuDzsqkLVVPHdtv01RM/Guzbnl64G8wNhlWmd/WbbSYNdv1e + Vz0JA1obLpUDoEfuKqrnm/m2+DBfSQnWichk1sA0GMeCh8gc1yqFXEzMg/n62Pw+d329H+h68g43 + qQYl7Xka0+IBzxmlN1ac8voQdv+JlZJfYlVw1eUxklkWj5Cgt4ACLbM6pkFfAsNclHRO28LDAYmZ + REImu9lIPomvIFEg4IGRzLJ4hKRgQkpcoFQJQoipMCecYBxF9Cp7nbg6ILGXkGBaU4mUWj/F46zy + FMa7zEjB70DiixvZCYlZzo5IGA3CF66YtUkTOZmZS0LsQBYZMvqg+YEEXAxHxKZu6XOwbze1BqUm + E3JtxZmYHMmt1foOhOSNCM1yfETICS7QFWTehUJEPTKMiU4g2u+gFKBS/YGQu0pojQ0+040C4LMA + XVhwgc+gNqD8FTx1Tss+p/8ESfPbQJpl+jhG1gQRVGZZisy0t5EFpyXjwiKA5aHAsKH5S5ACdsu4 + s28KzjnhKZR3lbNg7hAWYW8Uljm+jjko6uA8VSh13PcGnDlJFxQqp5jABJBD+8UnD3un/OThckl8 + 5bAXitsHPuxneTxikpVWkENgPjm3yxI1B8Jalkw0SifvCpSBiZhkIvg/NGCfxFeYgHD3yMmtmMzy + ePybIrQHAslSQdJ7U1iI1LCl5JSS3FIb4QYmcpIJpXQ+k0/iK0yMhUduimd5PGJCvy45WxQsaCpY + CzC01xHDXEJKSXPnMQ1M1HROlJgfkyPtFSJOGPnARGY5/Pbz7S8cGafhVREAAA== + headers: + Cache-Control: + - no-cache + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Type: + - application/json; charset=utf-8 + Date: + - Fri, 13 Dec 2019 16:51:15 GMT + Server: + - tenable.io + Set-Cookie: + - nginx-cloud-site-id=us-2b; path=/; HttpOnly; Secure + - nginx-cloud-site-id=us-2b; path=/; HttpOnly; Secure + Strict-Transport-Security: + - max-age=63072000; includeSubDomains + Transfer-Encoding: + - chunked + Vary: + - accept-encoding + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - DENY + X-Gateway-Site-ID: + - nginx-router-7ms2v-us-east-2-prod + X-Request-Uuid: + - 03d73c4ec32bfc50e59755b665d0bfd5 + X-Xss-Protection: + - 1; mode=block + status: + code: 200 + message: OK +version: 1 diff --git a/tests/integration/examples/test_examples.py b/tests/integration/examples/test_examples.py index d8cfe8d..e785401 100644 --- a/tests/integration/examples/test_examples.py +++ b/tests/integration/examples/test_examples.py @@ -32,6 +32,11 @@ def test_scans(self): from examples.scans import example example(TenableIOTestConfig.get('scan_text_targets')) + @pytest.mark.vcr() + def test_users(self): + from examples.users import example + example(TenableIOTestConfig.get('users_domain_name')) + @pytest.mark.vcr() def test_workbench(self): from examples.workbench import example From 300eae352a6c9e787da3cfd54fd0a7213f949586 Mon Sep 17 00:00:00 2001 From: Andrew Scott Date: Fri, 13 Dec 2019 12:20:50 -0500 Subject: [PATCH 2/6] Check for a property that will not change at test runtime --- examples/users.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/examples/users.py b/examples/users.py index 60fa2f4..22f661d 100644 --- a/examples/users.py +++ b/examples/users.py @@ -33,7 +33,8 @@ def example(test_domain): ''' std_user = client.users_api.details(std_user_id) assert isinstance(std_user, User) - assert std_user.username == test_user_username + assert std_user.permissions == Permissions.User.PERMISSION_STANDARD + ''' Check that new user is included in user list From b243871a30189426c64b1892b77def44f686b748 Mon Sep 17 00:00:00 2001 From: Andrew Scott Date: Fri, 13 Dec 2019 13:31:43 -0500 Subject: [PATCH 3/6] Missed an assertion --- examples/users.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/users.py b/examples/users.py index 22f661d..e79e04f 100644 --- a/examples/users.py +++ b/examples/users.py @@ -45,10 +45,10 @@ def example(test_domain): ''' Edit user ''' - user_edit_request = UserEditRequest(name=test_user_name+'_edit') + user_edit_request = UserEditRequest(permissions=Permissions.User.PERMISSION_SCAN_MANAGER) edited_std_user = client.users_api.edit(std_user_id, user_edit_request) assert isinstance(edited_std_user, User) - assert edited_std_user.name == test_user_name + '_edit' + assert edited_std_user.permissions == Permissions.User.PERMISSION_SCAN_MANAGER ''' Delete user From 084f310bd43dd99c76fe55cae5ea6e8b17e6ab7b Mon Sep 17 00:00:00 2001 From: Andrew Scott Date: Fri, 13 Dec 2019 14:42:09 -0500 Subject: [PATCH 4/6] update cassette with new permissions value --- .../cassettes/TestExamples.test_users.yaml | 94 +++++++++---------- 1 file changed, 47 insertions(+), 47 deletions(-) diff --git a/tests/integration/examples/cassettes/TestExamples.test_users.yaml b/tests/integration/examples/cassettes/TestExamples.test_users.yaml index 786a16e..c553b61 100644 --- a/tests/integration/examples/cassettes/TestExamples.test_users.yaml +++ b/tests/integration/examples/cassettes/TestExamples.test_users.yaml @@ -1,7 +1,7 @@ interactions: - request: - body: '{"username": "example_test_user_30@sdk.org", "password": "Sdk!Test123444", - "permissions": 32, "name": "example_test_user_30", "email": "example_test_user_30@sdk.org", + body: '{"username": "example_test_user_38@sdk.org", "password": "Sdk!Test123420", + "permissions": 32, "name": "example_test_user_38", "email": "example_test_user_38@sdk.org", "type": "local"}' headers: Accept: @@ -23,10 +23,10 @@ interactions: response: body: string: !!binary | - H4sIAAAAAAAAA41QSW7FIAy9C+tQJQE+SVb/JsiAQagJRAxSq6p3L+mw6Kb9S7/Jz34jrQVLNgJi - khJmRxenHeWTlnQRsFK8oRwnoZnVSAZyaTkfSCuYVYQDuxVf4Dh3VBVLVZ8EG+/FPj+l7MmX9DEl - HhD2/2V/hHW2vp4XuycDex9NihVC7Oz3oVxMWhu50FXPhnLjGNUjCMpuFu3KpF6E7T7wPqOH2rNq - bjiQE/MRSgkpFrKxeegbfIjK9crKpBYr2cZfYE21N7hAjKB3tD9JVxH1+NPfPwC5nxk0pAEAAA== + H4sIAAAAAAAAA41QSW7FIAy9C+tQkUB+htW/CQJjECqBiEFqVfXuJR0W3bR/6Tf52W+kNW/ITmAT + xi4To4zPlgo2AtVWAwVmb6MFQDstZCCXVswDaQWzjOrAbsUXdZwBZcVS5SfB13sxz08pO/IlfUyJ + h/Lhf9kfYZ2tr+fFhgQq9BFSrMrHzn4fKuZRa1hWuukJqADLqWZqpvxm0Gx80etsuk85l9Gp2rNq + bjiQE/PhS/EpFrLzaegbnI/S9soSUouV7OwXWFPtDS4Qo9IBzU/SVUQ+/vT3Dy8wZUSkAQAA headers: Cache-Control: - no-cache @@ -37,7 +37,7 @@ interactions: Content-Type: - application/json; charset=utf-8 Date: - - Fri, 13 Dec 2019 16:51:13 GMT + - Fri, 13 Dec 2019 19:41:31 GMT Server: - tenable.io Set-Cookie: @@ -54,7 +54,7 @@ interactions: X-Gateway-Site-ID: - nginx-router-7ms2v-us-east-2-prod X-Request-Uuid: - - 6994df15b4d565f1277fe156aedc96aa + - 24903c1c348664b15d5398ab207cd6ec status: code: 200 message: OK @@ -74,14 +74,14 @@ interactions: X-APIKeys: - accessKey=TIO_ACCESS_KEY;secretKey=TIO_SECRET_KEY method: GET - uri: https://cloud.tenable.com/users/44 + uri: https://cloud.tenable.com/users/45 response: body: string: !!binary | - H4sIAAAAAAAAA41QzW7DIAx+F85hSgKUJKe+CbLBVGgJRAGkTVXffaTbZZetR39/tr87qzU4tjBQ - g9Ywej559FwOqPmkYOZ0Id0PCoVDYh07tVJ2rGY6TISNmpU+YNtXMoVyMU9C9Nfs3t/ScWPf0teU - tEFY/5f9EdbY8rmf7JosrG20KRYIsbE/j0o1IFo98RlHy6X1gmMPiouLIzcLjZNyzbfTsYWcQ4qZ - LWLsWuAtROPbhcamGgtb+l9gSaUtPEGKgCu1XeWo1D0LNq93/PgC1BHLcJMBAAA= + H4sIAAAAAAAAA41QS27DIBC9C2tTYQPxZ5WbIBiGCBWDZUBKFOXuxWk32aRZzvvNzLuTWr0lC4FZ + WDcOjDIuHRWsB2qcAQrMnXoHgG4YSUcOrZAdqRl3FfWKzYpXvW4BVcFc1JPg0znb76+0X8iv9DMl + rtqH/2VvwhpbbtvBhgQ6tBFSLNrHxv49KmRvDIwTnc0AVIDj1DAtKT9ZtDMfzSRt8224rz5nn2Im + Cx+6FnjxUbl2oYJUYyELewFLKm3hAWLUJmDbVfaK3bNg9XnHjx9AcLmlkwEAAA== headers: Cache-Control: - no-cache @@ -92,7 +92,7 @@ interactions: Content-Type: - application/json; charset=utf-8 Date: - - Fri, 13 Dec 2019 16:51:13 GMT + - Fri, 13 Dec 2019 19:41:31 GMT Server: - tenable.io Set-Cookie: @@ -109,7 +109,7 @@ interactions: X-Gateway-Site-ID: - nginx-router-7ms2v-us-east-2-prod X-Request-Uuid: - - c5ded4aec1bed90a9666f5477ba009fd + - e47cd1aa4f410def4ec049e26a7823a7 status: code: 200 message: OK @@ -133,21 +133,21 @@ interactions: response: body: string: !!binary | - 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 headers: Cache-Control: - no-cache @@ -158,7 +158,7 @@ interactions: Content-Type: - application/json; charset=utf-8 Date: - - Fri, 13 Dec 2019 16:51:13 GMT + - Fri, 13 Dec 2019 19:41:32 GMT Server: - tenable.io Set-Cookie: @@ -177,14 +177,14 @@ interactions: X-Gateway-Site-ID: - nginx-router-7ms2v-us-east-2-prod X-Request-Uuid: - - 5d36665f8686f5bfd247f198c4e91b30 + - f484bebb855a1d64ada41de02738a360 X-Xss-Protection: - 1; mode=block status: code: 200 message: OK - request: - body: '{"name": "example_test_user_30_edit"}' + body: '{"permissions": 40}' headers: Accept: - '*/*' @@ -193,7 +193,7 @@ interactions: Connection: - keep-alive Content-Length: - - '37' + - '19' Content-Type: - application/json Cookie: @@ -203,15 +203,15 @@ interactions: X-APIKeys: - accessKey=TIO_ACCESS_KEY;secretKey=TIO_SECRET_KEY method: PUT - uri: https://cloud.tenable.com/users/44 + uri: https://cloud.tenable.com/users/45 response: body: string: !!binary | - H4sIAAAAAAAAA42Ry26EMAxF/yVrUgEhE2A1fxI5iaFRIUF5dFpV/feaPhbdtLP09bn2tfzGavWO - zQxkpxT0Cx8Xs/ChM4qPEiaOF1RtJ41wBlnDTnYYGlYzJh1gR7LiC+zHhrpgLvqzIdprdk8PMa3s - C72PxB389j/2xzCNzhdCyutxIlu0sFFpYyjgAyHf1w6yM8aqkU+mt3ywi+CmBcnFxaGbhDKjdOS7 - PULJAW/6GVP2MZCTVFjXhCsU2lBSxYYdmHafTyCzWfQN7V190Atdo22sobC5/SWWWCjXKWIAs6H7 - mXTG0/f/4/0DcoRCZb8BAAA= + H4sIAAAAAAAAA42RSXLDIBBF78JauNCAJXnlm1DQNAoVCVSA4rhSuXuaDItsEi/5//2eeGPH4S27 + MJgH68ZOcNFLxwfRAjfOAAfhzq0DQNeNrGGVHWTDjoxJBb0hRfFVb/uKqmAu6tPop2u2z6eYFvaF + Pkbipv36P/ZHMXLLfa/uGkGv9IQYivaB3O9FB9kaA+PEZ9MBH8D13AgteX+2aOd+NJO0lLs96ZID + 3tQLpuxjoCSpelkSLrpQh5IObNiOafO5ApkOIxrqu/igHC2iIB6hsMtvscRCc1URgzYr2p9KdTz1 + +Fe8fwAvZzl5ugEAAA== headers: Cache-Control: - no-cache @@ -222,7 +222,7 @@ interactions: Content-Type: - application/json; charset=utf-8 Date: - - Fri, 13 Dec 2019 16:51:14 GMT + - Fri, 13 Dec 2019 19:41:32 GMT Server: - tenable.io Set-Cookie: @@ -241,7 +241,7 @@ interactions: X-Gateway-Site-ID: - nginx-router-7ms2v-us-east-2-prod X-Request-Uuid: - - ec411298d20d8990393c2ae7d47db58b + - d830d39d237b902bc144ba8baaa8605a X-Xss-Protection: - 1; mode=block status: @@ -265,7 +265,7 @@ interactions: X-APIKeys: - accessKey=TIO_ACCESS_KEY;secretKey=TIO_SECRET_KEY method: DELETE - uri: https://cloud.tenable.com/users/44 + uri: https://cloud.tenable.com/users/45 response: body: string: '' @@ -275,7 +275,7 @@ interactions: Connection: - keep-alive Date: - - Fri, 13 Dec 2019 16:51:15 GMT + - Fri, 13 Dec 2019 19:41:33 GMT Server: - tenable.io Set-Cookie: @@ -292,7 +292,7 @@ interactions: X-Gateway-Site-ID: - nginx-router-7ms2v-us-east-2-prod X-Request-Uuid: - - 384db9dfd75e76169142dd956884da4e + - c88c3d5fb0f8180bb0b92f32decde00e X-Xss-Protection: - 1; mode=block status: @@ -342,7 +342,7 @@ interactions: Content-Type: - application/json; charset=utf-8 Date: - - Fri, 13 Dec 2019 16:51:15 GMT + - Fri, 13 Dec 2019 19:41:33 GMT Server: - tenable.io Set-Cookie: @@ -361,7 +361,7 @@ interactions: X-Gateway-Site-ID: - nginx-router-7ms2v-us-east-2-prod X-Request-Uuid: - - 03d73c4ec32bfc50e59755b665d0bfd5 + - c8ac7cf3af0b57b3ceabcf482142fdbd X-Xss-Protection: - 1; mode=block status: From fd37d79fd77fdeb61db2901dd8a93625b6b88da2 Mon Sep 17 00:00:00 2001 From: Andrew Scott Date: Tue, 17 Dec 2019 11:55:35 -0500 Subject: [PATCH 5/6] Adding support for missing editor API enpoints --- CHANGELOG.rst | 6 +- tenable_io/api/editor.py | 39 +- tenable_io/api/models.py | 265 ++++++++ .../api/cassettes/test_editor_details.yaml | 596 ++++++++++++++++++ .../cassettes/test_editor_plugin_details.yaml | 245 +++++++ .../test_editor_template_details.yaml | 309 +++++++++ tests/integration/api/test_editor.py | 41 +- 7 files changed, 1498 insertions(+), 3 deletions(-) create mode 100644 tests/integration/api/cassettes/test_editor_details.yaml create mode 100644 tests/integration/api/cassettes/test_editor_plugin_details.yaml create mode 100644 tests/integration/api/cassettes/test_editor_template_details.yaml diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 6f20a1a..c0a53a8 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -2,9 +2,13 @@ CHANGELOG ========= +Unreleased +========== +* Added: Support for missing Editor API endpoints. + 1.10.1 ========== -* Fixed missing ScanRef id attribute when initializing a ScanRef via the id method. +* Fixed: missing ScanRef id attribute when initializing a ScanRef via the id method. 1.10.0 ========== diff --git a/tenable_io/api/editor.py b/tenable_io/api/editor.py index 7e58551..5956d36 100644 --- a/tenable_io/api/editor.py +++ b/tenable_io/api/editor.py @@ -1,5 +1,5 @@ from tenable_io.api.base import BaseApi -from tenable_io.api.models import TemplateList +from tenable_io.api.models import EditorConfigurationDetails, EditorPluginDetails, EditorTemplateDetails, TemplateList class EditorApi(BaseApi): @@ -13,3 +13,40 @@ def list(self, type): """ response = self._client.get('editor/%(type)s/templates', path_params={'type': type}) return TemplateList.from_json(response.text) + + + def details(self, type, id): + """ + Gets the configuration details for the scan or policy. + :param type: Type of entity, must be `scan` or `policy`. + :param id: numeric id of the object. + :return: An instance of :class:`tenable_io.api.models.EditorConfigurationDetails`. + """ + response = self._client.get('editor/%(type)s/%(id)s', path_params={'type': type, 'id': id}) + return EditorConfigurationDetails.from_json(response.text) + + + def template_details(self, type, uuid): + """ + Gets the configuration details for a template. + :param type: Type of entity, must be `scan` or `policy`. + :param uuid: UUID of the template. + :return: An instance of :class:`tenable_io.api.models.EditorTemplateDetails`. + """ + response = self._client.get('editor/%(type)s/templates/%(uuid)s', path_params={'type': type, 'uuid': uuid}) + return EditorTemplateDetails.from_json(response.text) + + + def plugin_details(self, policy_id, family_id, plugin_id): + """ + Gets the configuration details for a plugin. + :param policy_id: id of the policy. + :param family_id: id of the plugin family. + :param plugin_id: id of the plugin. + :return: An instance of :class:`tenable_io.api.models.EditorPluginDescription`. + """ + response = self._client.get('editor/policy/%(policy_id)s/families/%(family_id)s/plugins/%(plugin_id)s', + path_params={'policy_id': policy_id, + 'family_id': family_id, + 'plugin_id': plugin_id}) + return EditorPluginDetails.from_json(response.text).plugindescription diff --git a/tenable_io/api/models.py b/tenable_io/api/models.py index 5c0490b..4cb90d1 100644 --- a/tenable_io/api/models.py +++ b/tenable_io/api/models.py @@ -2185,6 +2185,271 @@ def templates(self, templates): self._templates = templates +class EditorConfigurationFilterAttributes(BaseModel): + + def __init__( + self, + operators=None, + control=None, + name=None, + readable_name=None, + ): + self.operators = operators + self.control = control + self.name = name + self.readable_name = readable_name + + +class EditorTemplateDetails(BaseModel): + + def __init__( + self, + uuid=None, + name=None, + title=None, + owner=None, + user_permissions=None, + is_was=None, + is_agent=None, + settings=None, + filter_attributes=None, + ): + self._filter_attributes = None + + self.uuid = uuid + self.name = name + self.title = title + self.owner = owner + self.user_permissions = user_permissions + self.is_was = is_was + self.is_agent = is_agent + self.settings = settings + self.filter_attributes = filter_attributes + + @property + def filter_attributes(self): + return self._filter_attributes + + @filter_attributes.setter + @BaseModel._model_list(EditorConfigurationFilterAttributes) + def filter_attributes(self, filter_attributes): + self._filter_attributes = filter_attributes + + +class EditorPluginRiskInformation(BaseModel): + + def __init__( + self, + cvss_vector=None, + risk_factor=None, + cvss_base_score=None, + cvss_temporal_score=None, + cvss_temporal_vector=None + ): + self.cvss_vector = cvss_vector + self.risk_factor = risk_factor + self.cvss_base_score = cvss_base_score + self.cvss_temporal_score = cvss_temporal_score + self.cvss_temporal_vector = cvss_temporal_vector + + +class EditorPluginRefInformation(BaseModel): + + def __init__( + self, + ref=None, + ): + self.ref = ref + + +class EditorPluginPluginInformation(BaseModel): + + def __init__( + self, + plugin_id=None, + plugin_version=None, + plugin_type=None, + plugin_publication_date=None, + plugin_family=None, + plugin_modification_date=None, + ): + self.plugin_id = plugin_id + self.plugin_version = plugin_version + self.plugin_type = plugin_type + self.plugin_publication_date = plugin_publication_date + self.plugin_family = plugin_family + self.plugin_modification_date = plugin_modification_date + + +class EditorPluginVulnInformation(BaseModel): + + def __init__( + self, + cpe=None, + exploitability_ease=None, + exploit_available=None, + patch_publication_date=None + ): + self.cpe = cpe + self.exploitability_ease = exploitability_ease + self.exploit_available = exploit_available + self.patch_publication_date = patch_publication_date + + +class EditorPluginAttributes(BaseModel): + + def __init__( + self, + plugin_name=None, + synopsis=None, + description=None, + fname=None, + usn=None, + solution=None, + see_also=None, + risk_information=None, + ref_information=None, + plugin_information=None, + vuln_information=None + ): + self._risk_information = None + self._ref_information = None + self._plugin_information = None + self._vuln_information = None + + self.plugin_name = plugin_name + self.synopsis = synopsis + self.description = description + self.fname = fname + self.usn = usn + self.solution = solution + self.see_also = see_also + self.risk_information = risk_information + self.ref_information = ref_information + self.plugin_information = plugin_information + self.vuln_information = vuln_information + + @property + def risk_information(self): + return self._risk_information + + @risk_information.setter + @BaseModel._model(EditorPluginRiskInformation) + def risk_information(self, risk_information): + self._risk_information = risk_information + + @property + def ref_information(self): + return self._ref_information + + @ref_information.setter + @BaseModel._model(EditorPluginRefInformation) + def ref_information(self, ref_information): + self._ref_information = ref_information + + @property + def plugin_information(self): + return self._plugin_information + + @plugin_information.setter + @BaseModel._model(EditorPluginPluginInformation) + def plugin_information(self, plugin_information): + self._plugin_information = plugin_information + + @property + def vuln_information(self): + return self._vuln_information + + @vuln_information.setter + @BaseModel._model(EditorPluginVulnInformation) + def vuln_information(self, vuln_information): + self._vuln_information = vuln_information + + +class EditorPluginDescription(BaseModel): + + def __init__( + self, + pluginid=None, + pluginname=None, + pluginfamily=None, + severity=None, + pluginattributes=None, + ): + self._pluginattributes = None + + self.pluginid = pluginid + self.pluginname = pluginname + self.pluginfamily = pluginfamily + self.severity = severity + self.pluginattributes = pluginattributes + + @property + def pluginattributes(self): + return self._pluginattributes + + @pluginattributes.setter + @BaseModel._model(EditorPluginAttributes) + def pluginattributes(self, pluginattributes): + self._pluginattributes = pluginattributes + + +class EditorPluginDetails(BaseModel): + + def __init__( + self, + plugindescription=None + ): + self._plugindescription = None + + self.plugindescription = plugindescription + + @property + def plugindescription(self): + return self._plugindescription + + @plugindescription.setter + @BaseModel._model(EditorPluginDescription) + def plugindescription(self, plugindescription): + self._plugindescription = plugindescription + + +class EditorConfigurationDetails(BaseModel): + + def __init__( + self, + uuid=None, + name=None, + title=None, + owner=None, + user_permissions=None, + is_was=None, + is_agent=None, + settings=None, + filter_attributes=None, + ): + self._filter_attributes = None + + self.uuid = uuid + self.name = name + self.title = title + self.owner = owner + self.user_permissions = user_permissions + self.is_was = is_was + self.is_agent = is_agent + self.settings = settings + self.filter_attributes = filter_attributes + + @property + def filter_attributes(self): + return self._filter_attributes + + @filter_attributes.setter + @BaseModel._model_list(EditorConfigurationFilterAttributes) + def filter_attributes(self, filter_attributes): + self._filter_attributes = filter_attributes + + class User(BaseModel): LOCAL = u'local' diff --git a/tests/integration/api/cassettes/test_editor_details.yaml b/tests/integration/api/cassettes/test_editor_details.yaml new file mode 100644 index 0000000..3c63815 --- /dev/null +++ b/tests/integration/api/cassettes/test_editor_details.yaml @@ -0,0 +1,596 @@ +interactions: +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Cookie: + - nginx-cloud-site-id=us-2b + User-Agent: + - TenableIOSDK Python/3.7.3/1.10.1 + X-APIKeys: + - accessKey=TIO_ACCESS_KEY;secretKey=TIO_SECRET_KEY + method: GET + uri: https://cloud.tenable.com/editor/scan/templates + response: + body: + string: !!binary | + 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 + headers: + Accept-Ranges: + - bytes + Cache-Control: + - no-cache + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Length: + - '2374' + Content-Type: + - application/json; charset=utf-8 + Date: + - Tue, 17 Dec 2019 16:45:07 GMT + Expires: + - '0' + Pragma: + - '' + Server: + - tenable.io + Set-Cookie: + - nginx-cloud-site-id=us-2b; path=/; HttpOnly; Secure + - nginx-cloud-site-id=us-2b; path=/; HttpOnly; Secure + Strict-Transport-Security: + - max-age=63072000; includeSubDomains + Vary: + - accept-encoding + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - DENY + X-Gateway-Site-ID: + - nginx-router-oinnh-us-east-2-prod + X-Request-Uuid: + - 62b3a1d11abf5921932239eb5c2dca3b + X-Xss-Protection: + - 1; mode=block + status: + code: 200 + message: OK +- request: + body: '{"uuid": "731a8e52-3ea6-a291-ec0a-d2ff0619c19d7bd788d6be818b65", "settings": + {"name": "test_scan_fixture", "enabled": false, "text_targets": "fakehost.tenable.com", + "acls": [], "asset_lists": [], "agent_group_id": [], "tag_targets": []}}' + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '237' + Content-Type: + - application/json + Cookie: + - nginx-cloud-site-id=us-2b + User-Agent: + - TenableIOSDK Python/3.7.3/1.10.1 + X-APIKeys: + - accessKey=TIO_ACCESS_KEY;secretKey=TIO_SECRET_KEY + method: POST + uri: https://cloud.tenable.com/scans + response: + body: + string: !!binary | + H4sIAAAAAAAAA3VS2W7kIBD8F56HkfGJ52n/xGqgPYOCweLQbBLl39PMFa204cGy6Kruqmo+WdLg + 2emT6eAzWI9xsYadWD8IpfQk+axazXu9dlw1MPBuNGjmblJyMOzAwrUySrlxcBq00RK5aiXwHrqJ + y1m3fNTDiLIb5qEB4jzQGbfdQUYOA8I8KuBCT4K3U7/ycdWSt/0gZTOO89zIWTRKtj2sYhKiwYna + eNjw1iblpZpYVvs3l4hUMph0tHu2gaz54tyB7cFZ/X7z1nXN4Wb7afaOeN485DWPw//z+e0Imo0b + WJdeTTf6ZfXag3JIjVdwCUkipIsKEA3JdviEW69dMbjA+RzxTOGwU44F7+KWbDdcrtabcH0SdEk5 + bEuGeMZcR63whpeQ8jHfJx512Gh8IkSu/CcxxuLwJbNWPoJ/VX3IdrUaaoJVYMb4Y+kCsRqhEEui + vHaMm02JkAQRrazxr1Bc/rfSPB4LaQRvIl7/JPN2DPH8ekU19vbAHNBCt2B+BJhbEGKYxrGh7U9k + O+Jvpfy+12exF0ULp973jYuvr2903C2b6wIAAA== + headers: + Cache-Control: + - no-cache + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Type: + - application/json; charset=utf-8 + Date: + - Tue, 17 Dec 2019 16:45:07 GMT + Expires: + - '0' + Pragma: + - '' + Server: + - tenable.io + Set-Cookie: + - nginx-cloud-site-id=us-2b; path=/; HttpOnly; Secure + - nginx-cloud-site-id=us-2b; path=/; HttpOnly; Secure + Strict-Transport-Security: + - max-age=63072000; includeSubDomains + Transfer-Encoding: + - chunked + Vary: + - accept-encoding + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - DENY + X-Gateway-Site-ID: + - nginx-router-oinnh-us-east-2-prod + X-Request-Uuid: + - 94207881470cc86a36ec6d8ce586a963 + X-Xss-Protection: + - 1; mode=block + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Cookie: + - nginx-cloud-site-id=us-2b + User-Agent: + - TenableIOSDK Python/3.7.3/1.10.1 + X-APIKeys: + - accessKey=TIO_ACCESS_KEY;secretKey=TIO_SECRET_KEY + method: GET + uri: https://cloud.tenable.com/editor/scan/331 + response: + body: + string: !!binary | + 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 + qc5f/z/yzf4dgD0CAA== + headers: + Accept-Ranges: + - bytes + Cache-Control: + - no-cache + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Length: + - '20305' + Content-Type: + - application/json; charset=utf-8 + Date: + - Tue, 17 Dec 2019 16:45:08 GMT + Expires: + - '0' + Pragma: + - '' + Server: + - tenable.io + Set-Cookie: + - nginx-cloud-site-id=us-2b; path=/; HttpOnly; Secure + - nginx-cloud-site-id=us-2b; path=/; HttpOnly; Secure + Strict-Transport-Security: + - max-age=63072000; includeSubDomains + Vary: + - accept-encoding + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - DENY + X-Gateway-Site-ID: + - nginx-router-oinnh-us-east-2-prod + X-Request-Uuid: + - 11841e61fce2a79d9170ab29d4af950b + X-Xss-Protection: + - 1; mode=block + status: + code: 200 + message: OK +version: 1 diff --git a/tests/integration/api/cassettes/test_editor_plugin_details.yaml b/tests/integration/api/cassettes/test_editor_plugin_details.yaml new file mode 100644 index 0000000..acc1218 --- /dev/null +++ b/tests/integration/api/cassettes/test_editor_plugin_details.yaml @@ -0,0 +1,245 @@ +interactions: +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Cookie: + - nginx-cloud-site-id=us-2b + User-Agent: + - TenableIOSDK Python/3.7.3/1.10.1 + X-APIKeys: + - accessKey=TIO_ACCESS_KEY;secretKey=TIO_SECRET_KEY + method: GET + uri: https://cloud.tenable.com/editor/policy/templates + response: + body: + string: !!binary | + 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 + headers: + Accept-Ranges: + - bytes + Cache-Control: + - no-cache + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Length: + - '2374' + Content-Type: + - application/json; charset=utf-8 + Date: + - Tue, 17 Dec 2019 16:45:08 GMT + Expires: + - '0' + Pragma: + - '' + Server: + - tenable.io + Set-Cookie: + - nginx-cloud-site-id=us-2b; path=/; HttpOnly; Secure + - nginx-cloud-site-id=us-2b; path=/; HttpOnly; Secure + Strict-Transport-Security: + - max-age=63072000; includeSubDomains + Vary: + - accept-encoding + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - DENY + X-Gateway-Site-ID: + - nginx-router-lk167-us-east-2-prod + X-Request-Uuid: + - cc7d1e4f95bb41e375a1f18b9ccade8a + X-Xss-Protection: + - 1; mode=block + status: + code: 200 + message: OK +- request: + body: '{"uuid": "ad629e16-03b6-8c1d-cef6-ef8c9dd3c658d24bd260ef5f9e66", "settings": + {"acls": [], "description": "test_policies", "name": "test_policy_advanced"}}' + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '154' + Content-Type: + - application/json + Cookie: + - nginx-cloud-site-id=us-2b + User-Agent: + - TenableIOSDK Python/3.7.3/1.10.1 + X-APIKeys: + - accessKey=TIO_ACCESS_KEY;secretKey=TIO_SECRET_KEY + method: POST + uri: https://cloud.tenable.com/policies + response: + body: + string: !!binary | + H4sIAAAAAAAAA6tWKsjPyUyujM9MUbIyNjbSgfHzEnNTlayUSlKLS+KhQokpZYl5yakpSrUAA5UZ + cDYAAAA= + headers: + Cache-Control: + - no-cache + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Type: + - application/json; charset=utf-8 + Date: + - Tue, 17 Dec 2019 16:45:09 GMT + Expires: + - '0' + Pragma: + - '' + Server: + - tenable.io + Set-Cookie: + - nginx-cloud-site-id=us-2b; path=/; HttpOnly; Secure + - nginx-cloud-site-id=us-2b; path=/; HttpOnly; Secure + Strict-Transport-Security: + - max-age=63072000; includeSubDomains + Transfer-Encoding: + - chunked + Vary: + - accept-encoding + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - DENY + X-Gateway-Site-ID: + - nginx-router-lk167-us-east-2-prod + X-Request-Uuid: + - 231cb78c31e9d059b7032a0cb09dd022 + X-Xss-Protection: + - 1; mode=block + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Cookie: + - nginx-cloud-site-id=us-2b + User-Agent: + - TenableIOSDK Python/3.7.3/1.10.1 + X-APIKeys: + - accessKey=TIO_ACCESS_KEY;secretKey=TIO_SECRET_KEY + method: GET + uri: https://cloud.tenable.com/editor/policy/332/families/22/plugins/72663 + response: + body: + string: !!binary | + H4sIAAAAAAAAA4VUTW/bMAz9K4Qu24DMbrKiRXMbCnTbYUWB5LYOhiLTjhBZ0kQ6nVvsv4+yk3Tr + UOxi2OKHHt979JOKrm+tr5FMspFt8Gr5pAj3mCwPaul752aHJK87VEu1ulnfwaqPMSTGWh2jmjnZ + Tc9IY4exXWVCHJJttyx1660lmM5B3q6PIXh7/Q4WZ/Pz9/K4Au3rHA4PHmvYDLBGrzcOZ/DFmwJC + kgT42DTWWc0IvMWEoSkEBg0+RLJyvVyFkLALkrBafQbCtLcGgSbQBHmEXPLX2P+tkrvGSumzoYEY + u2L6FrgaYgocTHDQCMYWPSbt7KPMIFARtDFINJs+OGlPDabZOOx41GmvW+zQMzS9N1kIKWeLUsND + tEY7N0AQWfJExb2/97d5PN5qhr2k1mAS1lJvtRM4KRPwo7dyBhygRsbUWY9gmxPmAx2SkWFIWZja + HWYcuQIjdG8QJhFqodKhoNujoMmDGkysrc/zhd4zZVaTpV1lvYQ7fXTUeNZowyGJPrfBo/p1dE71 + mrEIscqw1PKb2jJHWpYl+uLB7mzE2uoipLbMX6VwUt0Ij9X6QG11d5BDfZ+p5nABNRyrTIXhwmty + ghV/GtfXWFc7FLer1oWNdhUhs/UtlZkiZyXsgmwJVcG74eT4lzNOq1SJRjTukZoXl38k12p5ubi4 + +HAaW3TN+zQZ9Tkx9hsnemfmqlo8Lil5O8qzRbk4f05rdGcFzFJ9mrz2HOlCbZt/O1yV83m5WGTe + j9aossS5/2JchojyI/AmNyXavmCKgusnNdVXvcvLJB4b/dITQmjkXfZAJJbN5AF0mxAJHixvYQh9 + ks1ttbeP41xvxKGyEJGzqcb67EBC0+e/DsQgBIj1s5n2vfMvidYkAsnhXuweUoa7Tr0Y6uSoV7mx + IoIaVZDs35TbnGP9BAAA + headers: + Accept-Ranges: + - bytes + Cache-Control: + - no-cache + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Length: + - '699' + Content-Type: + - application/json; charset=utf-8 + Date: + - Tue, 17 Dec 2019 16:45:09 GMT + Expires: + - '0' + Pragma: + - '' + Server: + - tenable.io + Set-Cookie: + - nginx-cloud-site-id=us-2b; path=/; HttpOnly; Secure + - nginx-cloud-site-id=us-2b; path=/; HttpOnly; Secure + Strict-Transport-Security: + - max-age=63072000; includeSubDomains + Vary: + - accept-encoding + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - DENY + X-Gateway-Site-ID: + - nginx-router-lk167-us-east-2-prod + X-Request-Uuid: + - 050f7084d7b504a2097c20b88a403e4c + X-Xss-Protection: + - 1; mode=block + status: + code: 200 + message: OK +version: 1 diff --git a/tests/integration/api/cassettes/test_editor_template_details.yaml b/tests/integration/api/cassettes/test_editor_template_details.yaml new file mode 100644 index 0000000..31ab785 --- /dev/null +++ b/tests/integration/api/cassettes/test_editor_template_details.yaml @@ -0,0 +1,309 @@ +interactions: +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Cookie: + - nginx-cloud-site-id=us-2b + User-Agent: + - TenableIOSDK Python/3.7.3/1.10.1 + X-APIKeys: + - accessKey=TIO_ACCESS_KEY;secretKey=TIO_SECRET_KEY + method: GET + uri: https://cloud.tenable.com/editor/scan/templates + response: + body: + string: !!binary | + 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 + headers: + Accept-Ranges: + - bytes + Cache-Control: + - no-cache + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Length: + - '2374' + Content-Type: + - application/json; charset=utf-8 + Date: + - Tue, 17 Dec 2019 16:45:08 GMT + Expires: + - '0' + Pragma: + - '' + Server: + - tenable.io + Set-Cookie: + - nginx-cloud-site-id=us-2b; path=/; HttpOnly; Secure + - nginx-cloud-site-id=us-2b; path=/; HttpOnly; Secure + Strict-Transport-Security: + - max-age=63072000; includeSubDomains + Vary: + - accept-encoding + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - DENY + X-Gateway-Site-ID: + - nginx-router-dmxvs-us-east-2-prod + X-Request-Uuid: + - e005d175fd1a5bb4f12b9f40ffefd8e4 + X-Xss-Protection: + - 1; mode=block + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Cookie: + - nginx-cloud-site-id=us-2b + User-Agent: + - TenableIOSDK Python/3.7.3/1.10.1 + X-APIKeys: + - accessKey=TIO_ACCESS_KEY;secretKey=TIO_SECRET_KEY + method: GET + uri: https://cloud.tenable.com/editor/scan/templates/cfc46c2d-30e7-bb2b-3b92-c75da136792d080c1fffcc429cfd + response: + body: + string: !!binary | + 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 + hpcAAA== + headers: + Accept-Ranges: + - bytes + Cache-Control: + - no-cache + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Length: + - '8098' + Content-Type: + - application/json; charset=utf-8 + Date: + - Tue, 17 Dec 2019 16:45:08 GMT + Expires: + - '0' + Pragma: + - '' + Server: + - tenable.io + Set-Cookie: + - nginx-cloud-site-id=us-2b; path=/; HttpOnly; Secure + - nginx-cloud-site-id=us-2b; path=/; HttpOnly; Secure + Strict-Transport-Security: + - max-age=63072000; includeSubDomains + Vary: + - accept-encoding + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - DENY + X-Gateway-Site-ID: + - nginx-router-dmxvs-us-east-2-prod + X-Request-Uuid: + - 5c3d245517198818d755f72267dd4827 + X-Xss-Protection: + - 1; mode=block + status: + code: 200 + message: OK +version: 1 diff --git a/tests/integration/api/test_editor.py b/tests/integration/api/test_editor.py index 844b548..6265479 100644 --- a/tests/integration/api/test_editor.py +++ b/tests/integration/api/test_editor.py @@ -1,6 +1,8 @@ import pytest -from tenable_io.api.models import TemplateList +from tenable_io.api.models import EditorConfigurationDetails, EditorPluginAttributes, EditorPluginDescription, \ + EditorTemplateDetails, TemplateList, PolicySettings +from tenable_io.api.policies import PolicyCreateRequest @pytest.mark.vcr() @@ -9,3 +11,40 @@ def test_editor_list(client): assert isinstance(template_list, TemplateList), u'The `list` method did not return type `TemplateList`.' policy_list = client.editor_api.list('policy') assert isinstance(policy_list, TemplateList), u'The `list` method did not return type `TemplateList`.' + + +@pytest.mark.vcr() +def test_editor_details(client, new_scan_id): + scan_configuration_details = client.editor_api.details('scan', new_scan_id) + assert isinstance(scan_configuration_details, EditorConfigurationDetails), \ + u'The `details` method did not return type `EditorConfigurationDetails`.' + + +@pytest.mark.vcr() +def test_editor_template_details(client): + template_list = client.editor_api.list('scan') + scan_template_details = client.editor_api.template_details('scan', template_list.templates[0].uuid) + assert isinstance(scan_template_details, EditorTemplateDetails), \ + u'The `template_details` method did not return type `EditorTemplateDetails`.' + + +@pytest.mark.vcr() +def test_editor_plugin_details(client): + # create new policy based on advanced template + template_list = client.editor_api.list('policy') + aadvanced_template = [t for t in template_list.templates if t.name == 'advanced'] + policy_id = client.policies_api.create( + PolicyCreateRequest( + aadvanced_template[0].uuid, + PolicySettings( + name='test_policy_advanced', + description='test_policies' + ) + ) + ) + + plugin_details = client.editor_api.plugin_details(policy_id=policy_id, family_id=22, plugin_id=72663) + assert isinstance(plugin_details, EditorPluginDescription), \ + u'The `plugin_details` method did not return type `EditorPluginDescription`.' + assert isinstance(plugin_details.pluginattributes, EditorPluginAttributes), \ + u'The `pluginattributes` method did not return type `EditorPluginAttributes`.' From 20ce2de7ed12540ba4cf96617b24d85371b48d32 Mon Sep 17 00:00:00 2001 From: Andrew Scott Date: Tue, 17 Dec 2019 12:22:54 -0500 Subject: [PATCH 6/6] Adding constants for the valid editor types --- tenable_io/api/editor.py | 2 ++ tests/integration/api/test_editor.py | 13 +++++++------ 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/tenable_io/api/editor.py b/tenable_io/api/editor.py index 5956d36..2189c52 100644 --- a/tenable_io/api/editor.py +++ b/tenable_io/api/editor.py @@ -1,6 +1,8 @@ from tenable_io.api.base import BaseApi from tenable_io.api.models import EditorConfigurationDetails, EditorPluginDetails, EditorTemplateDetails, TemplateList +SCAN = u'scan' +POLICY = u'policy' class EditorApi(BaseApi): diff --git a/tests/integration/api/test_editor.py b/tests/integration/api/test_editor.py index 6265479..d495414 100644 --- a/tests/integration/api/test_editor.py +++ b/tests/integration/api/test_editor.py @@ -1,5 +1,6 @@ import pytest +from tenable_io.api.editor import SCAN, POLICY from tenable_io.api.models import EditorConfigurationDetails, EditorPluginAttributes, EditorPluginDescription, \ EditorTemplateDetails, TemplateList, PolicySettings from tenable_io.api.policies import PolicyCreateRequest @@ -7,23 +8,23 @@ @pytest.mark.vcr() def test_editor_list(client): - template_list = client.editor_api.list('scan') + template_list = client.editor_api.list(SCAN) assert isinstance(template_list, TemplateList), u'The `list` method did not return type `TemplateList`.' - policy_list = client.editor_api.list('policy') + policy_list = client.editor_api.list(POLICY) assert isinstance(policy_list, TemplateList), u'The `list` method did not return type `TemplateList`.' @pytest.mark.vcr() def test_editor_details(client, new_scan_id): - scan_configuration_details = client.editor_api.details('scan', new_scan_id) + scan_configuration_details = client.editor_api.details(SCAN, new_scan_id) assert isinstance(scan_configuration_details, EditorConfigurationDetails), \ u'The `details` method did not return type `EditorConfigurationDetails`.' @pytest.mark.vcr() def test_editor_template_details(client): - template_list = client.editor_api.list('scan') - scan_template_details = client.editor_api.template_details('scan', template_list.templates[0].uuid) + template_list = client.editor_api.list(SCAN) + scan_template_details = client.editor_api.template_details(SCAN, template_list.templates[0].uuid) assert isinstance(scan_template_details, EditorTemplateDetails), \ u'The `template_details` method did not return type `EditorTemplateDetails`.' @@ -31,7 +32,7 @@ def test_editor_template_details(client): @pytest.mark.vcr() def test_editor_plugin_details(client): # create new policy based on advanced template - template_list = client.editor_api.list('policy') + template_list = client.editor_api.list(POLICY) aadvanced_template = [t for t in template_list.templates if t.name == 'advanced'] policy_id = client.policies_api.create( PolicyCreateRequest(