diff options
| author | Devendra | 2015-06-12 00:47:08 +0530 |
|---|---|---|
| committer | Devendra | 2015-06-12 00:47:08 +0530 |
| commit | 9d4c28c33efb7a546c96cafc5debf920de1d9931 (patch) | |
| tree | 6093d9f6b2ece22f66b375bcd952d2abcdf1425d | |
| parent | d0a49a0f9c81458b6c85ba9afabc515e46fd8989 (diff) | |
| parent | 437124952fd01eac9e8ccc132197ea6f18fdea56 (diff) | |
| download | pubnub-python-9d4c28c33efb7a546c96cafc5debf920de1d9931.tar.bz2 | |
Merge branch 'pam_demo' into develop
| -rw-r--r-- | Pubnub.py | 15 | ||||
| -rw-r--r-- | python/examples/pam_demo/demo.py | 104 |
2 files changed, 116 insertions, 3 deletions
@@ -991,6 +991,7 @@ class PubnubBase(object): if ("urlparams" in request): url = url + '?' + "&".join([x + "=" + str(y) for x, y in request[ "urlparams"].items() if y is not None and len(str(y)) > 0]) + #print(url) return url def _channel_registry(self, url=None, params=None, callback=None, error=None): @@ -1684,11 +1685,17 @@ class PubnubCoreAsync(PubnubBase): if channel_list is None: for ch in self.subscriptions: chobj = self.subscriptions[ch] - _invoke(chobj['error'], error) + try: + _invoke(chobj['error'], error, ch) + except TypeError: + _invoke(chobj['error'], error) else: for ch in channel_list: chobj = self.subscriptions[ch] - _invoke(chobj['error'], error) + try: + _invoke(chobj['error'], error, ch) + except TypeError: + _invoke(chobj['error'], error) def _get_channel(): for ch in self.subscriptions: @@ -1895,7 +1902,7 @@ class PubnubCoreAsync(PubnubBase): self.leave_channel(channel=channel) # remove channel from STATE - STATE.pop(channel, None) + self.STATE.pop(channel, None) self.CONNECT() @@ -2107,6 +2114,8 @@ def _requests_request(url, timeout=5): except requests.exceptions.Timeout as error: msg = str(error) return (json.dumps(msg), 0) + #print (resp.text) + #print (resp.status_code) return (resp.text, resp.status_code) diff --git a/python/examples/pam_demo/demo.py b/python/examples/pam_demo/demo.py new file mode 100644 index 0000000..a60730c --- /dev/null +++ b/python/examples/pam_demo/demo.py @@ -0,0 +1,104 @@ +from gevent.monkey import patch_all +patch_all() + +import sys +from Pubnub import Pubnub +import random +import json + +rand = str(random.randint(1,99999999)) + +def get_unique(s): + return 'str-' + rand + '-' + s + +# public channel +# This is the channel all clients announce themselves on -- or more generally speaking, a channel you expect the client +# to "check-in" on to announce his state + +channel_public = get_unique("channel_public") + +# server auth key +# Only the server has/knows about this auth token. It will be used to grant read on the "check-in" Presence channel + +server_auth_token = get_unique("server_auth_token") + +# client auth key +# only clients will use this authey -- it does not provide presence channel read access + +client_auth_token = get_unique("client_auth_token") + +# each client must have a unique id -- a UUID, for presence information/state to bind to + +# client uuid +client_uuid = get_unique("client_uuid") + +# server uuid +server_uuid = get_unique("server_uuid") + +# For the demo, we'll implement a SERVER called server, who is the authoritative 'admin' entity in the system +# We'll also implement a CLIENT called client, who is an arbitrary hardware device member of the network + +# Please swap out the default 'pam' demo keys with your own PAM-enabled keys + +# init server object +server = Pubnub(publish_key="pam", subscribe_key="pam", secret_key="pam", auth_key=server_auth_token, uuid=server_uuid) + +# init client object +client = Pubnub(publish_key="pam", subscribe_key="pam", auth_key=client_auth_token, uuid=client_uuid) + +# To access a Presence channel with PAM, its format is CHANNELNAME-pnpres + +# Grant permission to server auth keys +# grant r/w to public, and r/w public Presence (public-pnpres) + +print(server.grant(channel=channel_public, auth_key=server_auth_token, read=True, write=True)) +print(server.grant(channel=channel_public + '-pnpres', auth_key=server_auth_token, read=True, write=True)) + +# Grant permission to client auth keys +# grant r/w to public, and w-only access to public Presence (public-pnpres) +print(server.grant(channel=channel_public, auth_key=client_auth_token, read=True, write=False)) +print(server.grant(channel=channel_public + '-pnpres', auth_key=client_auth_token, read=False, write=False)) + +# Now, we'll run it to watch it work as advertised... + +# Define some simple callabcks for the Server and Client + +def _server_message_callback(message, channel): + print("Server heard: " + message) + +def _client_callback(channel, message): + print("Client heard: " + message) + +def _error_callback(error): + print("Error: " + error) + +def _server_presence_callback(message, channel): + print message + if 'action' in message: + if message['action'] == 'join' and message['uuid'] == client_uuid: + print "Server can see that client with UUID " + message['uuid'] + " has a state of " + json.dumps(message['data']) + +def _client_presence_callback(message, channel): + print message + if 'action' in message: + if message['action'] == 'join' and message['uuid'] == client_uuid: + print "Client can see that client with UUID " + message['uuid'] + " has a state of " + json.dumps(message['data']) + +# server subscribes to public channel +server.subscribe(channels=channel_public, callback=_server_message_callback, error=_error_callback) + +# server subscribes to presence events on public channel +# presence() is a convienence method that subscribes to channel-pnpres with special logic for handling +# presence-event formatted messages + +## uncomment out to see server able to read on presence channel +server.presence(channel=channel_public, callback=_server_presence_callback, error=_error_callback) + +# now if the client tried to subscribe on the presence channel, and therefore, get state info +# he is explicitly denied! + +## uncomment out to see client not able to read on presence channel +#client.presence(channel=channel_public, callback=_client_presence_callback, error=_error_callback) + +# client subscribes to public channel +client.subscribe(channels=channel_public, state={ "myKey" : get_unique("foo")}, callback=_client_callback, error=_error_callback) |
