Skip to content

Commit 15834f0

Browse files
PubNub SDK v5.4.0 release.
1 parent ea9d9bb commit 15834f0

File tree

10 files changed

+137
-74
lines changed

10 files changed

+137
-74
lines changed

.pubnub.yml

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
name: python
2-
version: 5.3.1
2+
version: 5.4.0
33
schema: 1
44
scm: github.com/pubnub/python
55
sdks:
@@ -169,6 +169,12 @@ sdks:
169169
license-url: https://github.com/aio-libs/aiohttp/blob/master/LICENSE.txt
170170
is-required: Required
171171
changelog:
172+
- version: v5.4.0
173+
date: 2021-10-07
174+
changes:
175+
-
176+
text: "Parse_token method refactored."
177+
type: feature
172178
- version: v5.3.1
173179
date: 2021-09-09
174180
changes:
@@ -469,9 +475,10 @@ features:
469475
- ACCESS-GRANT
470476
- ACCESS-GRANT-MANAGE
471477
- ACCESS-GRANT-DELETE
472-
- ACCESS-GRANT-V3
473-
- ACCESS-TOKEN-MANAGEMENT
474-
- ACCESS-SECRET-KEY-ALL-ACCESS
478+
- ACCESS-SECRET-KEY-ALL-ACCESS
479+
- ACCESS-GRANT-TOKEN
480+
- ACCESS-PARSE-TOKEN
481+
- ACCESS-SET-TOKEN
475482
channel-groups:
476483
- CHANNEL-GROUPS-ADD-CHANNELS
477484
- CHANNEL-GROUPS-REMOVE-CHANNELS

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
1+
## [v5.4.0](https://github.com/pubnub/python/releases/tag/v5.4.0)
2+
3+
[Full Changelog](https://github.com/pubnub/python/compare/v5.3.1...v5.4.0)
4+
5+
- 🌟️ Parse_token method refactored.
6+
17
## [v5.3.1](https://github.com/pubnub/python/releases/tag/v5.3.1)
28

39
[Full Changelog](https://github.com/pubnub/python/compare/v5.3.0...v5.3.1)

pubnub/managers.py

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -516,6 +516,42 @@ def set_token(self, token):
516516
def get_token(self):
517517
return self.token
518518

519+
@classmethod
520+
def parse_token(cls, token):
521+
token = cls.unwrap_token(token)
522+
523+
parsed_token = {
524+
"version": token["v"],
525+
"timestamp": token["t"],
526+
"ttl": token["ttl"],
527+
"authorized_uuid": token.get("uuid"),
528+
"resources": {},
529+
"patterns": {},
530+
"meta": token["meta"]
531+
}
532+
533+
perm_type_name_mapping = {
534+
"res": "resources",
535+
"pat": "patterns"
536+
}
537+
538+
for resource_type in perm_type_name_mapping:
539+
for resource in token[resource_type]:
540+
if resource == "uuid":
541+
parsed_token[perm_type_name_mapping[resource_type]]["uuids"] = utils.parse_pam_permissions(
542+
token[resource_type][resource]
543+
)
544+
elif resource == "grp":
545+
parsed_token[perm_type_name_mapping[resource_type]]["groups"] = utils.parse_pam_permissions(
546+
token[resource_type][resource]
547+
)
548+
elif resource == "chan":
549+
parsed_token[perm_type_name_mapping[resource_type]]["channels"] = utils.parse_pam_permissions(
550+
token[resource_type][resource]
551+
)
552+
553+
return parsed_token
554+
519555
@staticmethod
520556
def unwrap_token(token):
521557
token = token.replace("_", "/").replace("-", "+")

pubnub/pubnub_core.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@
6565

6666
class PubNubCore:
6767
"""A base class for PubNub Python API implementations"""
68-
SDK_VERSION = "5.3.1"
68+
SDK_VERSION = "5.4.0"
6969
SDK_NAME = "PubNub-Python"
7070

7171
TIMESTAMP_DIVIDER = 1000
@@ -268,7 +268,7 @@ def delete_messages(self):
268268
return HistoryDelete(self)
269269

270270
def parse_token(self, token):
271-
return self._token_manager.unwrap_token(token)
271+
return self._token_manager.parse_token(token)
272272

273273
def set_token(self, token):
274274
self._token_manager.set_token(token)

pubnub/utils.py

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -271,3 +271,51 @@ def decode_utf8_dict(dic):
271271
return new_l
272272
else:
273273
return dic
274+
275+
276+
def has_permission(perms, perm):
277+
return (perms & perm) == perm
278+
279+
280+
def has_read_permission(perms):
281+
return has_permission(perms, PAMPermissions.READ.value)
282+
283+
284+
def has_write_permission(perms):
285+
return has_permission(perms, PAMPermissions.WRITE.value)
286+
287+
288+
def has_delete_permission(perms):
289+
return has_permission(perms, PAMPermissions.DELETE.value)
290+
291+
292+
def has_manage_permission(perms):
293+
return has_permission(perms, PAMPermissions.MANAGE.value)
294+
295+
296+
def has_get_permission(perms):
297+
return has_permission(perms, PAMPermissions.GET.value)
298+
299+
300+
def has_update_permission(perms):
301+
return has_permission(perms, PAMPermissions.UPDATE.value)
302+
303+
304+
def has_join_permission(perms):
305+
return has_permission(perms, PAMPermissions.JOIN.value)
306+
307+
308+
def parse_pam_permissions(resource):
309+
new_res = {}
310+
for res_name, perms in resource.items():
311+
new_res[res_name] = {
312+
"read": has_read_permission(perms),
313+
"write": has_write_permission(perms),
314+
"manage": has_manage_permission(perms),
315+
"delete": has_delete_permission(perms),
316+
"get": has_get_permission(perms),
317+
"update": has_update_permission(perms),
318+
"join": has_join_permission(perms)
319+
}
320+
321+
return new_res

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
setup(
44
name='pubnub',
5-
version='5.3.1',
5+
version='5.4.0',
66
description='PubNub Real-time push service in the cloud',
77
author='PubNub',
88
author_email='support@pubnub.com',

tests/acceptance/pam/steps/given_steps.py

Lines changed: 15 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,7 @@
44
from pubnub.models.consumer.v3.channel import Channel
55
from pubnub.models.consumer.v3.group import Group
66
from pubnub.models.consumer.v3.uuid import UUID
7-
8-
from tests.helper import (
9-
has_join_permission, has_get_permission, has_read_permission, has_write_permission,
10-
has_delete_permission, has_update_permission, has_manage_permission, PAM_TOKEN_WITH_ALL_PERMS_GRANTED
11-
)
7+
from tests.helper import PAM_TOKEN_WITH_ALL_PERMS_GRANTED
128

139

1410
@given("I have a keyset with access manager enabled")
@@ -33,32 +29,32 @@ def step_impl(context, ttl):
3329

3430
@given("token pattern permission READ")
3531
def step_impl(context):
36-
assert has_read_permission(context.token_resource)
32+
assert context.token_resource["read"]
3733

3834

3935
@given("token pattern permission WRITE")
4036
def step_impl(context):
41-
assert has_write_permission(context.token_resource)
37+
assert context.token_resource["write"]
4238

4339

4440
@given("token pattern permission MANAGE")
4541
def step_impl(context):
46-
assert has_manage_permission(context.token_resource)
42+
assert context.token_resource["manage"]
4743

4844

4945
@given("token pattern permission UPDATE")
5046
def step_impl(context):
51-
has_update_permission(context.token_resource)
47+
assert context.token_resource["update"]
5248

5349

5450
@given("token pattern permission JOIN")
5551
def step_impl(context):
56-
has_join_permission(context.token_resource)
52+
assert context.token_resource["join"]
5753

5854

5955
@given("token pattern permission DELETE")
6056
def step_impl(context):
61-
has_delete_permission(context.token_resource)
57+
assert context.token_resource["delete"]
6258

6359

6460
@given("the {uuid_pattern} UUID pattern access permissions")
@@ -73,27 +69,27 @@ def step_impl(context, uuid_pattern):
7369

7470
@given("token resource permission WRITE")
7571
def step_impl(context):
76-
assert has_write_permission(context.token_resource)
72+
assert context.token_resource["write"]
7773

7874

7975
@given("token resource permission MANAGE")
8076
def step_impl(context):
81-
has_manage_permission(context.token_resource)
77+
assert context.token_resource["manage"]
8278

8379

8480
@given("token resource permission UPDATE")
8581
def step_impl(context):
86-
assert has_update_permission(context.token_resource)
82+
assert context.token_resource["update"]
8783

8884

8985
@given("token resource permission JOIN")
9086
def step_impl(context):
91-
assert has_join_permission(context.token_resource)
87+
assert context.token_resource["join"]
9288

9389

9490
@given("token resource permission DELETE")
9591
def step_impl(context):
96-
assert has_delete_permission(context.token_resource)
92+
assert context.token_resource["delete"]
9793

9894

9995
@given("grant pattern permission READ")
@@ -143,7 +139,7 @@ def step_impl(context, group_pattern):
143139

144140
@given("token pattern permission GET")
145141
def step_impl(context):
146-
assert has_get_permission(context.token_resource)
142+
assert context.token_resource["get"]
147143

148144

149145
@given("grant resource permission WRITE")
@@ -208,7 +204,7 @@ def step_impl(context, channel_pattern):
208204

209205
@given("token resource permission GET")
210206
def step_impl(context):
211-
assert has_get_permission(context.token_resource)
207+
assert context.token_resource["get"]
212208

213209

214210
@given("I have a known token containing UUID pattern Permissions")
@@ -228,7 +224,7 @@ def step_impl(context):
228224

229225
@given("token resource permission READ")
230226
def step_impl(context):
231-
assert has_read_permission(context.token_resource)
227+
assert context.token_resource["read"]
232228

233229

234230
@given("the authorized UUID {authorized_uuid}")

tests/acceptance/pam/steps/then_steps.py

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -13,46 +13,46 @@ def step_impl(context):
1313

1414
@then("the token has {channel} CHANNEL resource access permissions")
1515
def step_impl(context, channel):
16-
context.token_resource = context.parsed_token["res"]["chan"].get(channel.strip("'"))
16+
context.token_resource = context.parsed_token["resources"]["channels"].get(channel.strip("'"))
1717
assert context.token_resource
1818

1919

2020
@then("the token contains the authorized UUID {test_uuid}")
2121
def step_impl(context, test_uuid):
22-
assert context.parsed_token.get("uuid") == test_uuid.strip('"')
22+
assert context.parsed_token.get("authorized_uuid") == test_uuid.strip('"')
2323

2424

2525
@then("the parsed token output contains the authorized UUID {authorized_uuid}")
2626
def step_impl(context, authorized_uuid):
27-
assert context.parsed_token.get("uuid") == authorized_uuid.strip('"')
27+
assert context.parsed_token.get("authorized_uuid") == authorized_uuid.strip('"')
2828

2929

3030
@then("the token has {uuid} UUID resource access permissions")
3131
def step_impl(context, uuid):
32-
context.token_resource = context.parsed_token["res"]["uuid"].get(uuid.strip("'"))
32+
context.token_resource = context.parsed_token["resources"]["uuids"].get(uuid.strip("'"))
3333
assert context.token_resource
3434

3535

3636
@then("the token has {pattern} UUID pattern access permissions")
3737
def step_impl(context, pattern):
38-
context.token_resource = context.parsed_token["pat"]["uuid"].get(pattern.strip("'"))
38+
context.token_resource = context.parsed_token["patterns"]["uuids"].get(pattern.strip("'"))
3939

4040

4141
@then("the token has {channel_group} CHANNEL_GROUP resource access permissions")
4242
def step_impl(context, channel_group):
43-
context.token_resource = context.parsed_token["res"]["grp"].get(channel_group.strip("'"))
43+
context.token_resource = context.parsed_token["resources"]["groups"].get(channel_group.strip("'"))
4444
assert context.token_resource
4545

4646

4747
@then("the token has {channel_pattern} CHANNEL pattern access permissions")
4848
def step_impl(context, channel_pattern):
49-
context.token_resource = context.parsed_token["pat"]["chan"].get(channel_pattern.strip("'"))
49+
context.token_resource = context.parsed_token["patterns"]["channels"].get(channel_pattern.strip("'"))
5050
assert context.token_resource
5151

5252

5353
@then("the token has {channel_group} CHANNEL_GROUP pattern access permissions")
5454
def step_impl(context, channel_group):
55-
context.token_resource = context.parsed_token["pat"]["grp"].get(channel_group.strip("'"))
55+
context.token_resource = context.parsed_token["patterns"]["groups"].get(channel_group.strip("'"))
5656
assert context.token_resource
5757

5858

tests/helper.py

Lines changed: 0 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
from pubnub import utils
88
from pubnub.crypto import PubNubCryptodome
99
from pubnub.pnconfiguration import PNConfiguration
10-
from pubnub.enums import PAMPermissions
1110

1211

1312
PAM_TOKEN_WITH_ALL_PERMS_GRANTED = (
@@ -191,35 +190,3 @@ def pn_await(self, timeout=5):
191190

192191
self.t.cancel()
193192
self.lock.release()
194-
195-
196-
def has_permission(perms, perm):
197-
return (perms & perm) == perm
198-
199-
200-
def has_read_permission(perms):
201-
return has_permission(perms, PAMPermissions.READ.value)
202-
203-
204-
def has_write_permission(perms):
205-
return has_permission(perms, PAMPermissions.WRITE.value)
206-
207-
208-
def has_delete_permission(perms):
209-
return has_permission(perms, PAMPermissions.DELETE.value)
210-
211-
212-
def has_manage_permission(perms):
213-
return has_permission(perms, PAMPermissions.MANAGE.value)
214-
215-
216-
def has_get_permission(perms):
217-
return has_permission(perms, PAMPermissions.GET.value)
218-
219-
220-
def has_update_permission(perms):
221-
return has_permission(perms, PAMPermissions.UPDATE.value)
222-
223-
224-
def has_join_permission(perms):
225-
return has_permission(perms, PAMPermissions.JOIN.value)

0 commit comments

Comments
 (0)